/ Hex Artifact Content
Login

Artifact 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c:


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 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  f;.        pNew-
66b0: 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c  >u.iValue = iVal
66c0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
66d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66e0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
66f0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
6700: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
6710: 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65  n->z!=0 || pToke
6720: 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  n->n==0 );.     
6730: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
6740: 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e   ) memcpy(pNew->
6750: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
6760: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
6770: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
6780: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
6790: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
67a0: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 73  if( dequote && s
67b0: 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e  qlite3Isquote(pN
67c0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29  ew->u.zToken[0])
67d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
67e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
67f0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
6800: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6810: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
6820: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
6830: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6840: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6850: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6860: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6870: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6880: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6890: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
68a0: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
68b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
68c0: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
68d0: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
68e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
68f0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6900: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6910: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6920: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6930: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6950: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6970: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6980: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6990: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
69a0: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
69b0: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
69d0: 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  30(zToken);.  re
69e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
69f0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
6a00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
6a10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
6a20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
6a30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
6a40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
6a50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
6a60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
6a70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6a80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
6a90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
6aa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
6ab0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6ac0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
6ad0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
6ae0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
6af0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
6b00: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
6b10: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
6b20: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
6b30: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
6b40: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6b70: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
6b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6b90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6ba0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6bb0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
6bc0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
6bd0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6bf0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6c00: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
6c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6c20: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
6c30: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
6c40: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
6c50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6c60: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
6c70: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6c80: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6c90: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
6ca0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6cb0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
6cc0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
6cd0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
6ce0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
6cf0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
6d00: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
6d10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d20: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
6d30: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
6d40: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
6d50: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
6d60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6d70: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
6d80: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
6d90: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
6da0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
6db0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6dd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6de0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6e00: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6e10: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
6e20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
6e30: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
6e40: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
6e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
6e60: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29  ght operand */.)
6e70: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
6e80: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
6e90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
6ea0: 20 26 26 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f   && !IN_RENAME_O
6eb0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 2f 2a 20  BJECT ){.    /* 
6ec0: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6ed0: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6ee0: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6ef0: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f10: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f20: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6f30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6f40: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6f50: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6f60: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6f70: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6f80: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
6f90: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fa0: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
6fb0: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
6fc0: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
6fd0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
6fe0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6ff0: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7000: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7010: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7020: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
7030: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
7040: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
7050: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
7060: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7070: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
7080: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7090: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
70a0: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
70b0: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
70c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
70d0: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
70e0: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
70f0: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7100: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7110: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7120: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
7130: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
7140: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
7150: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
7160: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
7170: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
7180: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7190: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
71a0: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
71b0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
71c0: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
71d0: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
71e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
71f0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7200: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7210: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7220: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
7230: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
7240: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
7250: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
7260: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
7270: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
7280: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7290: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
72a0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
72b0: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
72c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
72d0: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
72e0: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
72f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7300: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7310: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7320: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
7330: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
7340: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
7350: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
7360: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
7370: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
7380: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7390: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
73a0: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
73b0: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
73c0: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
73d0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
73e0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
73f0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7400: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7410: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7420: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
7430: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
7440: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
7450: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
7460: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
7470: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
7480: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7490: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
74a0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
74b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
74c0: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
74d0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
74e0: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
74f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7500: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7510: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7520: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
7530: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
7540: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
7550: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
7560: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
7570: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7580: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7590: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
75a0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
75b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
75c0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
75d0: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
75e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
75f0: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7600: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7610: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7620: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
7630: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
7640: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
7650: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
7660: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
7670: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
7680: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7690: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
76a0: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
76b0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
76c0: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
76d0: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
76e0: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
76f0: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7700: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7710: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7720: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
7730: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
7740: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
7750: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
7760: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
7770: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7780: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7790: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
77a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
77b0: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
77c0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
77d0: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
77e0: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
77f0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7800: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7810: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7820: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7830: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7840: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7850: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
7860: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
7870: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
7880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7890: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
78a0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
78b0: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
78c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
78d0: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
78e0: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
78f0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7900: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7910: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7920: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
7930: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
7940: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
7950: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
7960: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
7970: 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50  xprFunction(.  P
7980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7990: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
79a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
79b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
79c0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c     /* Argument l
79d0: 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
79e0: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
79f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7a00: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
7a10: 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  eDistinct       
7a20: 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74    /* SF_Distinct
7a30: 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20   or SF_ALL or 0 
7a40: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
7a50: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
7a60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7a70: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7a80: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
7a90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7aa0: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
7ab0: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
7ac0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
7ad0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7ae0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
7af0: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
7b00: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
7b10: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
7b20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7b30: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
7b40: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72  st->nExpr > pPar
7b50: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
7b60: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7b70: 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20  TION_ARG] ){.   
7b80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7b90: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
7ba0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
7bb0: 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54  function %T", pT
7bc0: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  oken);.  }.  pNe
7bd0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7be0: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7bf0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7c00: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7c10: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7c20: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7c30: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7c40: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7c50: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7c60: 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65  , pNew);.  if( e
7c70: 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73  Distinct==SF_Dis
7c80: 74 69 6e 63 74 20 29 20 45 78 70 72 53 65 74 50  tinct ) ExprSetP
7c90: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7ca0: 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65  _Distinct);.  re
7cb0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7cc0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
7cd0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
7ce0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
7cf0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
7d00: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
7d10: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
7d20: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
7d30: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
7d40: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
7d50: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
7d60: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
7d70: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
7d80: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
7d90: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
7da0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
7db0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
7dc0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
7dd0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
7de0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69  n" is not too bi
7df0: 67 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  g to avoid a den
7e00: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
7e10: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
7e20: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7e30: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
7e40: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
7e50: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7e60: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
7e70: 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24  ", "@aaa", or "$
7e80: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
7e90: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
7ea0: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
7eb0: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
7ec0: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
7ed0: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
7ee0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7ef0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7f00: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
7f10: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61  xt sequential va
7f20: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
7f30: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
7f40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
7f50: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
7f60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7f70: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32  Expr *pExpr, u32
7f80: 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a   n){.  sqlite3 *
7f90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7fa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7fb0: 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20  ;.  ynVar x;..  
7fc0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7fd0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fe0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7ff0: 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
8000: 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c  alue|EP_Reduced|
8010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b  EP_TokenOnly) );
8020: 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  .  z = pExpr->u.
8030: 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  zToken;.  assert
8040: 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( z!=0 );.  asse
8050: 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  rt( z[0]!=0 );. 
8060: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32   assert( n==(u32
8070: 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  )sqlite3Strlen30
8080: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
8090: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
80a0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
80b0: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
80c0: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
80d0: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
80e0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
80f0: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
8100: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8110: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
8120: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
8130: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
8140: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
8150: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
8160: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
8170: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
8180: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
8190: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
81a0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
81b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
81c0: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
81d0: 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  bOk;.      if( n
81e0: 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==2 ){ /*OPTIMIZ
81f0: 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
8200: 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d          i = z[1]
8210: 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f  -'0';  /* The co
8220: 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20  mmon case of ?N 
8230: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67  for a single dig
8240: 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  it N */.        
8250: 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
8260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f  else{.        bO
8270: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
8280: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
8290: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
82a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
82b0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
82c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
82d0: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
82e0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
82f0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8300: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8310: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
8320: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
8330: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8340: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8350: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
8360: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
8370: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
8380: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8390: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
83a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
83b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
83c0: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
83d0: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
83e0: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
83f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
8400: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8410: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8420: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
8430: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8440: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8450: 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78  r)i;.      if( x
8460: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
8470: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8480: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a  >nVar = (int)x;.
8490: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
84a0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
84b0: 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  f( sqlite3VListN
84c0: 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
84d0: 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29  >pVList, x)==0 )
84e0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  {.        doAdd 
84f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8510: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
8520: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
8530: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
8540: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
8550: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
8560: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
8570: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
8580: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
8590: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
85a0: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
85b0: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
85c0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
85d0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
85e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20       */.      x 
85f0: 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33  = (ynVar)sqlite3
8600: 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70  VListNameToNum(p
8610: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
8620: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
8630: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
8640: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8650: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
8660: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
8670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8680: 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20    if( doAdd ){. 
8690: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
86a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69  ist = sqlite3VLi
86b0: 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65  stAdd(db, pParse
86c0: 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20  ->pVList, z, n, 
86d0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
86e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
86f0: 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e   x;.  if( x>db->
8700: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8710: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8720: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
8730: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8740: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
8750: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
8760: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
8770: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
8780: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8790: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
87a0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
87b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
87c0: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
87d0: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  b, Expr *p){.  a
87e0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
87f0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
8800: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
8810: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
8820: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
8830: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
8840: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8850: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
8860: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
8870: 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73  alue>=0 );..  as
8880: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8890: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
88a0: 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57  Func) || p->y.pW
88b0: 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  in!=0 || db->mal
88c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
88d0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
88e0: 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70  _FUNCTION || Exp
88f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8900: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8910: 52 65 64 75 63 65 64 29 0a 20 20 20 20 20 20 20  Reduced).       
8920: 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d     || p->y.pWin=
8930: 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
8940: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
8950: 75 6e 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53  unc) );.#ifdef S
8960: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
8970: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8980: 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26  y(p, EP_Leaf) &&
8990: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
89a0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
89b0: 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  y) ){.    assert
89c0: 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  ( p->pLeft==0 );
89d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89e0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
89f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53   assert( p->x.pS
8a00: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a  elect==0 );.  }.
8a10: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78  #endif.  if( !Ex
8a20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8a30: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
8a40: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
8a50: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
8a60: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
8a70: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
8a80: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
8a90: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
8aa0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
8ab0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8ac0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8ad0: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8ae0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8b00: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8b10: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  );.    if( p->pR
8b20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
8b30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8b40: 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  N(db, p->pRight)
8b50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8b60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8b70: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
8b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b90: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8ba0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8bb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8bd0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8be0: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8bf0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
8c00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
8c10: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 61  Func) ){.      a
8c20: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
8c30: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8c40: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8c50: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79 2e  Delete(db, p->y.
8c60: 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pWin);.    }.  }
8c70: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8c80: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
8c90: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
8ca0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
8cb0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  zToken);.  if( !
8cc0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8cd0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
8ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8cf0: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d  eeNN(db, p);.  }
8d00: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
8d10: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
8d20: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
8d30: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
8d40: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8d50: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
8d60: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8d70: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
8d80: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
8d90: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
8da0: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
8db0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
8dc0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
8dd0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
8de0: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
8df0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
8e00: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8e10: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
8e20: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
8e30: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
8e40: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8e50: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8e60: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8e70: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
8e80: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8e90: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
8ea0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
8eb0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
8ec0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
8ed0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
8ee0: 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
8ef0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
8f00: 45 78 70 72 20 6e 6f 64 65 2c 20 74 61 6b 69 6e  Expr node, takin
8f10: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
8f20: 61 64 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65  ad.** past the e
8f30: 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
8f40: 75 72 65 20 66 6f 72 20 61 20 72 65 64 75 63 65  ure for a reduce
8f50: 64 2d 73 69 7a 65 20 76 65 72 73 69 6f 6e 20 6f  d-size version o
8f60: 66 20 74 68 65 20 73 6f 75 72 63 65 0a 2a 2a 20  f the source.** 
8f70: 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Expr..*/.static 
8f80: 76 6f 69 64 20 65 78 70 72 4e 6f 64 65 43 6f 70  void exprNodeCop
8f90: 79 28 45 78 70 72 20 2a 70 44 65 73 74 2c 20 45  y(Expr *pDest, E
8fa0: 78 70 72 20 2a 70 53 72 63 29 7b 0a 20 20 6d 65  xpr *pSrc){.  me
8fb0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 73  mset(pDest, 0, s
8fc0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
8fd0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2c 20 70 53  memcpy(pDest, pS
8fe0: 72 63 2c 20 65 78 70 72 53 74 72 75 63 74 53 69  rc, exprStructSi
8ff0: 7a 65 28 70 53 72 63 29 29 3b 0a 7d 0a 0a 2f 2a  ze(pSrc));.}../*
9000: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
9010: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
9020: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
9030: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9040: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
9050: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
9060: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
9070: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
9080: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
9090: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
90a0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
90b0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
90c0: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
90d0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
90e0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
90f0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
9100: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
9110: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
9120: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
9130: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
9140: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
9150: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
9160: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
9170: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
9180: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
91d0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
91e0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
91f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9200: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
9210: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
9220: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
9230: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
9240: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
9250: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
9260: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
9270: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
9280: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
9290: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
92a0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
92b0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
92c0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
92d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
92e0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
92f0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
9300: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
9310: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
9320: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
9330: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
9340: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
9350: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
9360: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
9370: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
9380: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
9390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
93a0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
93b0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
93c0: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
93d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
93e0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
93f0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
9400: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
9410: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9420: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
9430: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
9440: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
9450: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
9460: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
9470: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
9480: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
9490: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
94a0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
94b0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
94c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
94d0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
94e0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
94f0: 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63  f the Expr objec
9500: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
9510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
9520: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
9530: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
9540: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
9550: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
9560: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
9570: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
9580: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
9590: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
95a0: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
95b0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
95c0: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
95d0: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
95e0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
95f0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
9600: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
9610: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
9620: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
9630: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
9640: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
9650: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
9660: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
9670: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
9680: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9690: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
96a0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
96b0: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
96c0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
96d0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
96e0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
96f0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
9700: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
9710: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
9720: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
9730: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
9740: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
9750: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
9760: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
9770: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9780: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9790: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
97a0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
97b0: 0a 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72  .   || ExprHasPr
97c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
97d0: 46 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29  Func).#endif.  )
97e0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
97f0: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d  PR_FULLSIZE;.  }
9800: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9810: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9820: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
9830: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
9840: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9850: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9860: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
9870: 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ; .    assert( !
9880: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9890: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
98a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
98b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
98c0: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20  p, EP_NoReduce) 
98d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
98e0: 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73  eft || p->x.pLis
98f0: 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  t ){.      nSize
9900: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
9910: 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64  IZE | EP_Reduced
9920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9940: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
9950: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f   nSize = EXPR_TO
9960: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
9970: 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
9980: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9990: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
99a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
99b0: 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69  urns the space i
99c0: 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  n bytes required
99d0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
99e0: 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78  py .** of the Ex
99f0: 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  pr structure and
9a00: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9a10: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72  xpr.u.zToken str
9a20: 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20  ing (if that.** 
9a30: 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65  string is define
9a40: 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d.).*/.static in
9a50: 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  t dupedExprNodeS
9a60: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9a70: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9a80: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9a90: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c  StructSize(p, fl
9aa0: 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20  ags) & 0xfff;.  
9ab0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
9ac0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
9ad0: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
9ae0: 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ken ){.    nByte
9af0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
9b00: 6e 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65  n30NN(p->u.zToke
9b10: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
9b20: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
9b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b40: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9b50: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9b60: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
9b70: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
9b80: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
9b90: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
9ba0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
9bb0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
9bc0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9bd0: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9be0: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
9bf0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9c00: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
9c10: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
9c20: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9c30: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
9c40: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9c50: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9c60: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
9c70: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
9c80: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
9c90: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
9ca0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
9cb0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
9cc0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9cd0: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9ce0: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
9cf0: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
9d00: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
9d10: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
9d20: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
9d30: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
9d40: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9d50: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9d60: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
9d70: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
9d80: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
9d90: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9da0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
9db0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9dc0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9de0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
9df0: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
9e00: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
9e10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9e20: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9e30: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9e40: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9e50: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9e60: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
9e70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9e80: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
9e90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9ea0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
9eb0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
9ec0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9ed0: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9ee0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
9ef0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
9f00: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
9f10: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
9f20: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
9f30: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
9f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9f50: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9f60: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
9f70: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
9f80: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
9f90: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
9fa0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
9fb0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
9fc0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9fd0: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9fe0: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
9ff0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
a000: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
a010: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
a020: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
a030: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a040: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
a050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
a060: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
a070: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
a080: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
a090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
a0a0: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
a0b0: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
a0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
a0d0: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
a0e0: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
a0f0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
a100: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
a110: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
a120: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
a130: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
a140: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
a150: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
a160: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
a170: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
a180: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
a190: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
a1a0: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
a1b0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
a1c0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
a1d0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
a1e0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
a1f0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
a200: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
a210: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a220: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
a230: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
a240: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
a250: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
a260: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
a270: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
a280: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
a290: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
a2a0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
a2b0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
a2c0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
a2d0: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
a2e0: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
a2f0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
a300: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
a310: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
a320: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
a330: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
a340: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
a350: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
a360: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
a370: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
a380: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
a390: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
a3a0: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
a3b0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
a3c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
a3d0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
a3e0: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
a3f0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
a400: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
a410: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
a420: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
a430: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
a440: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
a450: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
a460: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
a470: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
a480: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a490: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
a4a0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
a4b0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
a4c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
a4d0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
a4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
a4f0: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
a500: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
a510: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
a520: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a530: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
a540: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
a550: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
a560: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
a570: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
a580: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
a590: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
a5a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
a5b0: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
a5c0: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
a5d0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
a5e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a5f0: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
a600: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
a610: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
a620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
a630: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
a640: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
a650: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
a660: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
a670: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
a680: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
a690: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a6a0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
a6b0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
a6c0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
a6d0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
a6e0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a6f0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
a700: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
a710: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
a720: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
a730: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
a740: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
a750: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
a760: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
a770: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
a780: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
a790: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
a7a0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
a7b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
a7c0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a7d0: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a7e0: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a7f0: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a800: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a810: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a820: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a830: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a840: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a850: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a860: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a870: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a880: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a890: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a8a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a8b0: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a8c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a8d0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a8e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a8f0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a900: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a910: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a920: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a930: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a940: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a950: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a960: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a970: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a980: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e  TokenOnly|EP_Win
a990: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a  Func) ){.      z
a9a0: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a9b0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a9c0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a9d0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a9e0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a9f0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
aa10: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
aa20: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
aa30: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
aa40: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
aa50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
aa60: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
aa70: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
aa80: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
aa90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aaa0: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
aab0: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
aac0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
aad0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
aae0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
aaf0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
ab00: 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78  UNC.      if( Ex
ab10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ab20: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
ab30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e          pNew->y.
ab40: 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69  pWin = sqlite3Wi
ab50: 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77  ndowDup(db, pNew
ab60: 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20  , p->y.pWin);.  
ab70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
ab80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
ab90: 65 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  ew, EP_WinFunc) 
aba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
abb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
abc0: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
abd0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
abe0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  r ){.        *pz
abf0: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
ac00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ac10: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45  se{.      if( !E
ac20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ac30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
ac40: 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  P_Leaf) ){.     
ac50: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
ac60: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
ac70: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
ac80: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
ac90: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
aca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c   assert( p->iCol
acb0: 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  umn==0 || p->pRi
acc0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
acd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ace0: 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e  Right==0  || p->
acf0: 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74  pRight==p->pLeft
ad00: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
ad10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
ad20: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
ad30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ad40: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
ad50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
ad60: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
ad70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ad80: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
ad90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ada0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
adb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
adc0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
add0: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
ade0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
adf0: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
ae00: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
ae10: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
ae20: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
ae30: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
ae40: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
ae50: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
ae60: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
ae70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
ae80: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
ae90: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
aea0: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
aeb0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
aec0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
aed0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
aee0: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
aef0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
af00: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
af10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
af20: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
af30: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
af40: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
af50: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
af60: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
af70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
af80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
af90: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
afa0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
afb0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
afc0: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
afd0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
afe0: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
aff0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
b000: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
b010: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
b020: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
b030: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b040: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
b050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
b070: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
b080: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
b090: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   0.#endif..#ifnd
b0a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
b0b0: 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  INDOWFUNC./*.** 
b0c0: 54 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74  The gatherSelect
b0d0: 57 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64  Windows() proced
b0e0: 75 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70  ure and its help
b0f0: 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61  er routine.** ga
b100: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b110: 73 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20  sCallback() are 
b120: 75 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c  used to scan all
b130: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
b140: 0a 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64  .** an a newly d
b150: 75 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54  uplicated SELECT
b160: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67   statement and g
b170: 61 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  ather all of the
b180: 20 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63   Window.** objec
b190: 74 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20  ts found there, 
b1a0: 61 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20  assembling them 
b1b0: 6f 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  onto the linked 
b1c0: 6c 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e  list at Select->
b1d0: 70 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pWin..*/.static 
b1e0: 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74  int gatherSelect
b1f0: 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28  WindowsCallback(
b200: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
b210: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
b220: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b230: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
b240: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20  Expr->y.pWin!=0 
b250: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45  ){.    assert( E
b260: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b270: 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
b280: 29 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ) );.    pExpr->
b290: 79 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  y.pWin->pNextWin
b2a0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
b2b0: 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20  elect->pWin;.   
b2c0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
b2d0: 65 63 74 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70  ect->pWin = pExp
b2e0: 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20  r->y.pWin;.  }. 
b2f0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
b300: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
b310: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b320: 69 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c  indowsSelectCall
b330: 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61  back(Walker *pWa
b340: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
b350: 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70 57  {.  return p==pW
b360: 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
b370: 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20   ? WRC_Continue 
b380: 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73  : WRC_Prune;.}.s
b390: 74 61 74 69 63 20 76 6f 69 64 20 67 61 74 68 65  tatic void gathe
b3a0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 53  rSelectWindows(S
b3b0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c  elect *p){.  Wal
b3c0: 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
b3d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b3e0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61  rSelectWindowsCa
b3f0: 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c  llback;.  w.xSel
b400: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61  ectCallback = ga
b410: 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77  therSelectWindow
b420: 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b  sSelectCallback;
b430: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b440: 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 70  back2 = 0;.  w.p
b450: 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 77 2e 75  Parse = 0;.  w.u
b460: 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  .pSelect = p;.  
b470: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
b480: 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64  t(&w, p);.}.#end
b490: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
b4a0: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
b4b0: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
b4c0: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
b4d0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
b4e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
b4f0: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
b500: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
b510: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
b520: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
b530: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
b540: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
b550: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
b560: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
b570: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
b580: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
b590: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
b5a0: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
b5b0: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
b5c0: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
b5d0: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
b5e0: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
b5f0: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
b600: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
b610: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
b620: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
b630: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
b640: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
b650: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
b660: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
b670: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
b680: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
b690: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
b6a0: 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  icated..**.** Th
b6b0: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b6c0: 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d  r contains a com
b6d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
b6e0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
b6f0: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  s..** If the EXP
b700: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
b710: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
b720: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
b730: 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75  rned is a.** tru
b740: 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  ncated version o
b750: 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72  f the usual Expr
b760: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b770: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  will be stored a
b780: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  s.** part of the
b790: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
b7a0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b7b0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
b7c0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
b7d0: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
b7e0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
b7f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
b800: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
b810: 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  | flags==EXPRDUP
b820: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74  _REDUCE );.  ret
b830: 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28  urn p ? exprDup(
b840: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
b850: 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74   : 0;.}.ExprList
b860: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
b870: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b880: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
b890: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
b8a0: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
b8b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b8c0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
b8d0: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
b8e0: 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65    Expr *pPriorSe
b8f0: 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61  lectCol = 0;.  a
b900: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b910: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b920: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
b930: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b940: 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33  awNN(db, sqlite3
b950: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
b960: 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77   p));.  if( pNew
b970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b980: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
b990: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65  p->nExpr;.  pIte
b9a0: 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70  m = pNew->a;.  p
b9b0: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
b9c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b9d0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
b9e0: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
b9f0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
ba00: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
ba10: 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  >pExpr;.    Expr
ba20: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
ba30: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
ba40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ba50: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
ba60: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  s);.    if( pOld
ba70: 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f  Expr .     && pO
ba80: 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  ldExpr->op==TK_S
ba90: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20  ELECT_COLUMN.   
baa0: 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d    && (pNewExpr =
bab0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d   pItem->pExpr)!=
bac0: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
bad0: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
bae0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
baf0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  i>0 );.      if(
bb00: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
bb10: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
bb20: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70   assert( pOldExp
bb30: 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78  r->pLeft==pOldEx
bb40: 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20  pr->pRight );.  
bb50: 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65        pPriorSele
bb60: 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72  ctCol = pNewExpr
bb70: 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78  ->pLeft = pNewEx
bb80: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
bb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bba0: 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
bbb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bbc0: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21  pItem[-1].pExpr!
bbd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
bbe0: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e  sert( pNewExpr->
bbf0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d  iColumn==pItem[-
bc00: 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  1].pExpr->iColum
bc10: 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  n+1 );.        a
bc20: 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c  ssert( pPriorSel
bc30: 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31  ectCol==pItem[-1
bc40: 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ].pExpr->pLeft )
bc50: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78  ;.        pNewEx
bc60: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69  pr->pLeft = pPri
bc70: 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20  orSelectCol;.   
bc80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bc90: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
bca0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
bcb0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
bcc0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
bcd0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
bce0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bcf0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
bd00: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
bd10: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
bd20: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
bd30: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
bd40: 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73    pItem->bSpanIs
bd50: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
bd60: 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20  bSpanIsTab;.    
bd70: 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
bd80: 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  f = pOldItem->bS
bd90: 6f 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49  orterRef;.    pI
bda0: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
bdb0: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
bdc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
bdd0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
bde0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
bdf0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
be00: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
be10: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
be20: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
be30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
be40: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
be50: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
be60: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
be70: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
be80: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
be90: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
bea0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
beb0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
bec0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bed0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
bee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bef0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
bf00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
bf20: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
bf30: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
bf40: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
bf50: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
bf60: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
bf70: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
bf80: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
bf90: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bfa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bfb0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
bfc0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
bfd0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
bfe0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
bff0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
c000: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c010: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
c020: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
c030: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c040: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
c050: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
c060: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
c070: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
c080: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
c090: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
c0a0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
c0b0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
c0c0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
c0d0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
c0e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
c0f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
c100: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
c110: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c120: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
c130: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
c140: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c150: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
c160: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
c170: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
c180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
c190: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
c1a0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
c1b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c1c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c1d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
c1e0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
c1f0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
c200: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
c210: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
c220: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
c230: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
c240: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
c250: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
c260: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
c270: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
c280: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
c290: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
c2a0: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
c2b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
c2c0: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
c2d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c2e0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
c2f0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
c300: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
c310: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
c320: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
c330: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
c340: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
c350: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
c360: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
c370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c380: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
c390: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
c3a0: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
c3b0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
c3c0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
c3d0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
c3e0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
c3f0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
c400: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
c410: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
c420: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
c430: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
c440: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
c450: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
c460: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
c470: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
c480: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
c490: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c4a0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
c4b0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
c4c0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
c4d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
c4e0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
c4f0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
c500: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c510: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
c520: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
c530: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
c540: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
c550: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
c560: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c570: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c580: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
c590: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c5a0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c5b0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
c5c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
c5d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
c5e0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
c5f0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c600: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
c610: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
c620: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
c630: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
c640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
c650: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
c660: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
c670: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
c680: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
c690: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
c6a0: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
c6b0: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
c6c0: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
c6d0: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
c6e0: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
c6f0: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
c700: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
c710: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
c720: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
c730: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
c740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
c750: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c760: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
c770: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
c780: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
c790: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
c7a0: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
c7b0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
c7c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
c7d0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
c7e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
c7f0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
c800: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
c810: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
c820: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c830: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c840: 65 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74  elect *pDup, int
c850: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
c860: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53  t *pRet = 0;.  S
c870: 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30  elect *pNext = 0
c880: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20  ;.  Select **pp 
c890: 3d 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63  = &pRet;.  Selec
c8a0: 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  t *p;..  assert(
c8b0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28   db!=0 );.  for(
c8c0: 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e  p=pDup; p; p=p->
c8d0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
c8e0: 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ect *pNew = sqli
c8f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c900: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
c910: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c920: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c930: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
c940: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c950: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
c960: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c970: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
c980: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
c990: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
c9a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  .    pNew->pWher
c9b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
c9c0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
c9d0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c9e0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
c9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ca00: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
ca10: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
ca20: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
ca30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ca40: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
ca50: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
ca60: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
ca70: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ca80: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
ca90: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
caa0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20  >op = p->op;.   
cab0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
cac0: 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Next;.    pNew->
cad0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cae0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
caf0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
cb00: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
cb10: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
cb20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
cb30: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
cb40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
cb50: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
cb60: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
cb70: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
cb80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
cb90: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cba0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
cbb0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
cbc0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
cbd0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
cbe0: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
cbf0: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
cc00: 57 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53  With);.#ifndef S
cc10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cc20: 57 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e  WFUNC.    pNew->
cc30: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e  pWin = 0;.    pN
cc40: 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73  ew->pWinDefn = s
cc50: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
cc60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44  Dup(db, p->pWinD
cc70: 65 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  efn);.    if( p-
cc80: 3e 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65  >pWin ) gatherSe
cc90: 6c 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77  lectWindows(pNew
cca0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e  );.#endif.    pN
ccb0: 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73  ew->selId = p->s
ccc0: 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20  elId;.    *pp = 
ccd0: 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26  pNew;.    pp = &
cce0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pNew->pPrior;.  
ccf0: 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a    pNext = pNew;.
cd00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
cd10: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  et;.}.#else.Sele
cd20: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
cd30: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
cd40: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
cd50: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
cd60: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
cd70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
cd80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
cd90: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
cda0: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
cdb0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
cdc0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
cdd0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
cde0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
cdf0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
ce00: 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61  *.** The pList a
ce10: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
ce20: 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
ce30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45   pointer to an E
ce40: 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69  xprList.** obtai
ce50: 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ned from a prior
ce60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ce70: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29  ExprListAppend()
ce80: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
ce90: 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ** may not be us
cea0: 65 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c  ed with an ExprL
ceb0: 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ist obtained fro
cec0: 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  m sqlite3ExprLis
ced0: 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f  tDup()..** Reaso
cee0: 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n:  This routine
cef0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
cf00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  e number of slot
cf10: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a  s in pList->a[].
cf20: 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ** is a power of
cf30: 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74   two.  That is t
cf40: 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45  rue for sqlite3E
cf50: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20  xprListAppend() 
cf60: 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69  returns.** but i
cf70: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
cf80: 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20  y true from the 
cf90: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
cfa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cfb0: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  up()..**.** If a
cfc0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
cfd0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
cfe0: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
cff0: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
d000: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d010: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
d020: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
d030: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
d040: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
d050: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
d060: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
d070: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
d080: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
d090: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
d0a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d0b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d0c0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d0d0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d0e0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d0f0: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
d100: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d110: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
d130: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
d140: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
d150: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  NULL */.){.  str
d160: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d170: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
d180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d190: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d1a0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
d1b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
d1c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
d1d0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
d1e0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
d1f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
d200: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
d210: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d220: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
d230: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  r = 0;.  }else i
d240: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
d250: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
d260: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  -1))==0 ){.    E
d270: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
d280: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
d290: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
d2a0: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  List, .         
d2b0: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
d2c0: 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78  t)+(2*pList->nEx
d2d0: 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  pr - 1)*sizeof(p
d2e0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
d2f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
d300: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
d310: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
d320: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
d330: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
d340: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
d350: 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ++];.  assert( o
d360: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d370: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
d380: 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65  me)==sizeof(pIte
d390: 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61  m->pExpr) );.  a
d3a0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d3b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d3c0: 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29  item,pExpr)==0 )
d3d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65  ;.  memset(&pIte
d3e0: 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f  m->zName,0,sizeo
d3f0: 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74  f(*pItem)-offset
d400: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
d410: 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b  st_item,zName));
d420: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
d430: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
d440: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
d450: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
d460: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
d470: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
d480: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
d490: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
d4a0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
d4b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d4c0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
d4d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d4e0: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
d4f0: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
d500: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
d510: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
d520: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
d530: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
d540: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
d550: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
d560: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
d570: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
d580: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
d590: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
d5a0: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
d5b0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
d5c0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
d5d0: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
d5e0: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
d5f0: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
d600: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
d610: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
d620: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
d630: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
d640: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
d650: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
d660: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
d670: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d680: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
d690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d6a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d6b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d6d0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
d6e0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
d6f0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d700: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
d710: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
d720: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
d730: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
d740: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
d750: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
d760: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
d770: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
d780: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
d790: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d7a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d7b0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
d7c0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
d7d0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
d7e0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
d7f0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
d800: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
d810: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
d820: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
d830: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
d840: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
d850: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
d860: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
d870: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
d880: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d890: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d8a0: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
d8b0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d8c0: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
d8d0: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
d8e0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
d8f0: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
d900: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
d910: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
d920: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
d930: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
d940: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
d950: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
d960: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
d970: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d980: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
d990: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
d9a0: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
d9b0: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
d9c0: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
d9d0: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
d9e0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
d9f0: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
da00: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
da10: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
da20: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
da30: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
da40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
da50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
da60: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
da70: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da90: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
daa0: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
dab0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
dac0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
dad0: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
dae0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
daf0: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
db00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
db10: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
db20: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
db30: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
db40: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
db50: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
db60: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
db70: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
db80: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
db90: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
dba0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
dbb0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
dbc0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
dbd0: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
dbe0: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
dbf0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
dc00: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
dc10: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
dc20: 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e  ailed && pExpr->
dc30: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
dc40: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30   ALWAYS(pList!=0
dc50: 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ) ){.    Expr *p
dc60: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
dc70: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
dc80: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
dc90: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
dca0: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
dcb0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
dcc0: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
dcd0: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
dce0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
dcf0: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
dd00: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
dd10: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
dd20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
dd30: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
dd40: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
dd50: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
dd60: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
dd70: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
dd80: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
dd90: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
dda0: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
ddb0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
ddc0: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
ddd0: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
dde0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
ddf0: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
de00: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
de10: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
de20: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
de30: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
de40: 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
de50: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
de60: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
de70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
de80: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
de90: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
dea0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
deb0: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
dec0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
ded0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
dee0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
def0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
df00: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
df10: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
df20: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
df30: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
df40: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
df50: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
df60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
df70: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
df80: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
df90: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
dfa0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
dfb0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
dfc0: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
dfd0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
dfe0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dff0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
e000: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
e010: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
e020: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
e030: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
e040: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
e050: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
e060: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e070: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
e080: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e090: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e0a0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e0b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e0c0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e0d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e0e0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e0f0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
e100: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e110: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e120: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e130: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e140: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e150: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e160: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e170: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
e180: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
e190: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e1a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e1b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e1c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e1d0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e1e0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e1f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
e200: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
e210: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
e220: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
e230: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
e240: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
e250: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
e260: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
e270: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
e280: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
e290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
e2a0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
e2b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
e2c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e2d0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
e2e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e2f0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
e300: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
e310: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
e320: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
e330: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
e340: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
e350: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
e360: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
e370: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
e380: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
e390: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
e3a0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e3b0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
e3c0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
e3d0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
e3e0: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
e3f0: 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  d*)pItem->zName,
e400: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
e410: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
e420: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
e430: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
e440: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
e450: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
e460: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
e470: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
e480: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
e490: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
e4a0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
e4b0: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
e4c0: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
e4d0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
e4e0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
e4f0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
e500: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
e510: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
e520: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e530: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
e540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e550: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e570: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
e580: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
e590: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
e5a0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  e span. */.  con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
e5c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
e5d0: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63   the span */.  c
e5e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
e5f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e600: 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a   the span */.){.
e610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e620: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
e630: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
e640: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e650: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e660: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e670: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e680: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
e690: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e6a0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e6b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e6d0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e6e0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e6f0: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
e700: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
e710: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
e720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
e730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e740: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
e750: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
e760: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
e770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
e780: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
e790: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e7a0: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
e7b0: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
e7c0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
e7d0: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
e7e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
e7f0: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
e800: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
e810: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e820: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
e830: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e840: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e850: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e860: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e870: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
e880: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
e890: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
e8a0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
e8b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e8c0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
e8d0: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
e8e0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
e8f0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
e900: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
e910: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  st..*/.static SQ
e920: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
e930: 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74  id exprListDelet
e940: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
e950: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e960: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  ){.  int i = pLi
e970: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72  st->nExpr;.  str
e980: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e990: 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73  m *pItem =  pLis
e9a0: 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20  t->a;.  assert( 
e9b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e9c0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
e9d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
e9e0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
e9f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ea00: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
ea10: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ea20: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
ea30: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
ea40: 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  Item++;.  }while
ea50: 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c  ( --i>0 );.  sql
ea60: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
ea70: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
ea80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ea90: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
eaa0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
eab0: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
eac0: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
ead0: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
eae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
eaf0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
eb00: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
eb10: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
eb20: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
eb30: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
eb40: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
eb50: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
eb60: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
eb70: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73   u32 m = 0;.  as
eb80: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
eb90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
eba0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ebb0: 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45  ){.     Expr *pE
ebc0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
ebd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73  ].pExpr;.     as
ebe0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
ebf0: 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70  ;.     m |= pExp
ec00: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  r->flags;.  }.  
ec10: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
ec20: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c  ** This is a SEL
ec30: 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63  ECT-node callbac
ec40: 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  k for the expres
ec50: 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74  sion walker that
ec60: 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c  .** always "fail
ec70: 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69  s".  By "fail" i
ec80: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20  n this case, we 
ec90: 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c  mean set.** pWal
eca0: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65  ker->eCode to ze
ecb0: 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a  ro and abort..**
ecc0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
ecd0: 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c  k is used by mul
ece0: 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  tiple expression
ecf0: 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74   walkers..*/.int
ed00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
ed10: 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70  lkFail(Walker *p
ed20: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
ed30: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
ed40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
ed50: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
ed60: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
ed70: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ed80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
ed90: 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
eda0: 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20  n is an ID with 
edb0: 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20  the name "true" 
edc0: 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68  or "false".** th
edd0: 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  en convert it in
ede0: 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c  to an TK_TRUEFAL
edf0: 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  SE term.  Return
ee00: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20   non-zero if.** 
ee10: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68  the conversion h
ee20: 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72  appened, and zer
ee30: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
ee40: 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64  ion is unaltered
ee50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee60: 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73  ExprIdToTrueFals
ee70: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
ee80: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ee90: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
eea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  xpr->op==TK_STRI
eeb0: 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  NG );.  if( !Exp
eec0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
eed0: 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a 20  pr, EP_Quoted). 
eee0: 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72    && (sqlite3Str
eef0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
ef00: 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30  oken, "true")==0
ef10: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
ef20: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ef30: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73  >u.zToken, "fals
ef40: 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  e")==0).  ){.   
ef50: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
ef60: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72  TRUEFALSE;.    r
ef70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
ef80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ef90: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
efa0: 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45  ust be a TK_TRUE
efb0: 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e  FALSE Expr node.
efc0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74    Return 1 if it
efd0: 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20   is TRUE.** and 
efe0: 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45  0 if it is FALSE
eff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f000: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63  ExprTruthValue(c
f010: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
f020: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
f030: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  pr->op==TK_TRUEF
f040: 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ALSE );.  assert
f050: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f060: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
f070: 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20  ,"true")==0.    
f080: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
f090: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
f0a0: 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30  oken,"false")==0
f0b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   );.  return pEx
f0c0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d  pr->u.zToken[4]=
f0d0: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  =0;.}.../*.** Th
f0e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f0f0: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
f100: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
f110: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
f120: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
f130: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
f140: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
f150: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
f160: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
f170: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
f180: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
f190: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
f1a0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f1c0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f1d0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f1e0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f1f0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f200: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f210: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f220: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f230: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f240: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f250: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f260: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f270: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f290: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f2b0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f2d0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f2e0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f2f0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f300: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f310: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f320: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f330: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f340: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f350: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f360: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f370: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f380: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f390: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f3a0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f3b0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f3c0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f3d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f3e0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f3f0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f400: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f410: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f420: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f440: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f450: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f460: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f470: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f480: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f490: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f4a0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f4b0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f4c0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f4d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f4e0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f4f0: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f500: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f510: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f520: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f530: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f540: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f550: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f560: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f570: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f580: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f590: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f5a0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f5b0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f5c0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f5d0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f5e0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f5f0: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f600: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f610: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f620: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f630: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f640: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f650: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f660: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f670: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f680: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f690: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f6a0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f6b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f6c0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f6d0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f6e0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f6f0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f700: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f710: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f720: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f730: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f740: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f750: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f760: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f770: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f780: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f790: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f7a0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
f7b0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
f7c0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
f7d0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
f7e0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
f7f0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f800: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
f810: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
f820: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
f830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f840: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f860: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f870: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f880: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f890: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f8a0: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
f8b0: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
f8c0: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
f8d0: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
f8e0: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
f8f0: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
f900: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
f910: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
f920: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
f930: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
f940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f950: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f960: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f970: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
f980: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
f990: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
f9a0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
f9b0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
f9c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f9d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f9e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f9f0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fa00: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fa10: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fa20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
fa30: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
fa40: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fa50: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
fa60: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
fa70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fa80: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
fa90: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
faa0: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
fab0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fac0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fad0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
fae0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
faf0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
fb00: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
fb10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fb20: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fb30: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fb40: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
fb50: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
fb60: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
fb70: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
fb80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
fba0: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fbb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fbc0: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fbd0: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fbe0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fbf0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fc00: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fc10: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fc20: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fc30: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fc40: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
fc50: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
fc60: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fc70: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fc80: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fc90: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
fca0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
fcb0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
fcc0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
fcd0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
fce0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fcf0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
fd00: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
fd10: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
fd20: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
fd30: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
fd40: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
fd50: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
fd60: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fd70: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
fd80: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
fd90: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fda0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
fdb0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
fdc0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
fdd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fde0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fdf0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
fe00: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
fe10: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
fe20: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe30: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fe40: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fe50: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fe60: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fe70: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fe80: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
fe90: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fea0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
feb0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fec0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fed0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
fee0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
fef0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
ff00: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
ff10: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
ff20: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
ff30: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
ff40: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
ff50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
ff60: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ff70: 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
ff80: 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
ff90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ffa0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ffb0: 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
ffc0: 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
ffd0: 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
ffe0: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
fff0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10000 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10010 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10020 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10030 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10040 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10050 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10060 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
10070 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
10080 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
10090 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
100a0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
100b0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
100c0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
100d0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
100e0 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
100f0 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10100 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10110 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10120 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10130 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10140 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10150 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
10160 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
10170 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
10180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
10190 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
101a0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
101b0 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
101c0 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
101d0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
101e0 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
101f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10200 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10210 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10220 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10230 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10240 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
10250 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
10260 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
10270 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
10280 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
10290 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
102a0 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
102b0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
102c0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
102d0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
102e0 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
102f0 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
10300 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10310 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10320 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10330 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10340 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
10350 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
10360 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10370 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
10380 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
10390 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
103a0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
103b0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
103c0 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
103d0 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
103e0 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
103f0 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10400 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10410 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10420 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10430 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10440 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
10450 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
10460 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
10470 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
10480 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
10490 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
104a0 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
104b0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
104c0 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
104d0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
104e0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
104f0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
10500 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10510 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10520 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10530 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10540 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
10550 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
10560 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
10570 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10580 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
10590 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
105a0 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
105b0 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
105c0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
105d0 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
105e0 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
105f0 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
10600 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10610 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10620 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10630 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10640 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
10650 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
10660 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
10670 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
10680 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
10690 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
106a0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
106b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
106c0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
106d0 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
106e0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
106f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10700 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10710 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10720 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10730 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10750 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
10760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10770 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10780 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
10790 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
107a0 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
107b0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
107c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
107d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
107e0 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
107f0 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
10800 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10810 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10820 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10830 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10840 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
10850 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
10860 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
10870 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10880 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
10890 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
108a0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
108b0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
108c0 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
108d0 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
108e0 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
108f0 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
10900 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10910 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10920 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10930 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10940 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
10950 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
10960 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
10970 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
10980 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
10990 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
109a0 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
109b0 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
109c0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
109d0 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
109e0 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
109f0 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
10a00 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10a10 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10a20 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10a30 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10a40 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
10a50 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
10a60 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
10a70 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
10a80 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
10a90 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
10aa0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10ab0 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10ac0 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10ad0 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10ae0 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10af0 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10b00 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10b10 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10b20 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10b30 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10b40 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
10b50 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
10b60 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
10b70 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
10b80 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
10b90 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
10ba0 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10bb0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10bc0 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10bd0 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10be0 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10bf0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10c00 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10c10 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10c20 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10c30 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10c40 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10c50 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10c60 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10c70 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10c80 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10c90 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10ca0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10cb0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10cc0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10cd0 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10ce0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10cf0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10d00 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10d10 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10d20 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10d30 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10d40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10d50 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10d60 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10d70 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10d80 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10d90 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10da0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10dc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10dd0 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10de0 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10df0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10e00 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10e10 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10e20 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10e30 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10e40 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10e50 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10e60 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10e70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10e80 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10e90 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10ea0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
10eb0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
10ec0 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
10ed0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10ee0 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
10ef0 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10f10 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
10f20 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
10f30 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
10f40 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
10f50 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
10f60 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10f70 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
10f80 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
10f90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
10fa0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
10fb0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10fc0 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10fd0 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
10fe0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
10ff0 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
11000 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
11010 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
11020 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
11030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11040 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
11050 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
11060 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11070 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11080 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
11090 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
110a0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
110b0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
110c0 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
110d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
110e0 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
110f0 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
11100 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
11110 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
11120 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
11130 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
11140 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
11150 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
11160 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
11170 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
11180 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
11190 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
111a0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
111b0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
111c0 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
111d0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
111e0 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
111f0 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
11200 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11210 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11220 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11230 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11240 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
11250 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
11260 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
11270 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11280 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11290 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
112a0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
112b0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
112c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
112d0 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
112e0 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
112f0 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
11300 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11310 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11320 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11330 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11340 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11350 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
11360 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
11370 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11380 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
11390 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
113a0 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
113b0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
113c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
113d0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
113e0 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
113f0 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
11400 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11410 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11420 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11430 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11440 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11450 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11460 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
11470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11480 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11490 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
114a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
114b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
114c0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
114d0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
114e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
114f0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
11500 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11510 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11520 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11530 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11540 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11550 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11570 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
11580 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
11590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
115a0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
115b0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
115c0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
115d0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
115e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
115f0 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
11600 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11620 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11630 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11640 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11650 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11660 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
11670 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
11680 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
11690 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
116a0 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
116b0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
116c0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
116d0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
116e0 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
116f0 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
11700 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11710 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11720 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11730 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11740 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11750 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
11760 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
11770 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
11780 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
11790 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
117a0 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
117b0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
117c0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
117d0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
117e0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
117f0 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
11800 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11810 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11820 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11830 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11840 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11850 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11860 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
11870 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
11880 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11890 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
118a0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
118b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
118c0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
118d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
118e0 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
118f0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
11900 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11910 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11920 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11930 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11940 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
11950 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
11960 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
11970 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
11980 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
11990 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
119a0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
119b0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
119c0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
119d0 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
119e0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
119f0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11a00 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11a10 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11a20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11a30 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11a40 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11a50 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11a60 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11a70 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11a80 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11a90 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11aa0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11ab0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11ac0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11ad0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11ae0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11af0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11b00 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11b10 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11b20 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11b30 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11b40 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11b50 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11b60 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11b70 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11b80 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11b90 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11ba0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11bb0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11bc0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11bd0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11be0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11bf0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11c00 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11c10 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11c20 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11c30 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11c40 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11c50 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11c60 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11c70 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11c80 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11ca0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11cb0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11cc0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11cd0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11ce0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11cf0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11d00 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11d10 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11d20 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11d30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11d40 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11d50 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11d60 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11d70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11d80 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11d90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11da0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11dc0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11dd0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11de0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11df0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11e00 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11e10 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11e20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11e30 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11e40 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11e50 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11e60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11e70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11e80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11e90 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11ea0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11eb0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11ec0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11ed0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11ee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11ef0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11f00 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11f10 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11f20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f30 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11f40 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11f50 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11f60 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11f70 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11f80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11f90 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
11fa0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
11fb0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
11fc0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11fd0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11fe0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11ff0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
12000 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
12010 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
12020 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
12030 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
12040 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
12050 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
12060 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
12070 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
12080 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
12090 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
120a0 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
120b0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
120c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
120d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
120e0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
120f0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12100 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
12110 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
12120 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
12130 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
12140 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12150 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
12160 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12170 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12180 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12190 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
121a0 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
121b0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
121c0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
121d0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
121e0 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
121f0 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
12200 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12210 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12230 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12240 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
12250 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12260 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12270 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
12280 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12290 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
122a0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
122b0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
122c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
122d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
122e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
122f0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
12300 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12310 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12320 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12330 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12340 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
12350 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12360 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12380 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
12390 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
123a0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
123b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
123c0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
123d0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
123e0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
123f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12400 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12410 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12420 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12440 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
12450 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
12460 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12470 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
12480 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
12490 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
124a0 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
124b0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
124c0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
124d0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
124e0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
124f0 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
12500 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12510 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12520 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12530 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12540 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
12550 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
12560 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
12570 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12580 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
12590 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
125a0 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
125b0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
125c0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
125d0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
125e0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
125f0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
12600 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12610 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12620 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12630 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12640 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
12650 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
12660 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
12670 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12680 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
12690 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
126a0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
126b0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
126c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
126d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
126e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
126f0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12710 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12720 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12730 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12740 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12750 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12760 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12770 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
12780 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
12790 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
127a0 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
127b0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
127c0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
127d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
127e0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
127f0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
12800 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12810 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12820 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12830 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12840 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12850 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12860 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12870 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
12880 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
12890 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
128a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
128b0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
128c0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
128d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
128e0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
128f0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
12900 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12910 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12920 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12930 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12940 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12950 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12960 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12970 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
12980 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
12990 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
129a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
129b0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
129c0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
129d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
129e0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
129f0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12a00 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12a10 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12a20 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12a30 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12a40 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12a50 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12a60 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12a70 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
12a80 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
12a90 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
12aa0 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12ab0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12ac0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12ad0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12ae0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12af0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12b00 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12b10 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12b20 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12b30 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12b40 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12b50 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12b60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12b70 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
12b80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12b90 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
12ba0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12bb0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12bc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12bd0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12be0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12bf0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12c00 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12c10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12c20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12c30 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12c50 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12c60 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12c70 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12c80 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12c90 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12ca0 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12cb0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12cc0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12cd0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12ce0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12cf0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12d00 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12d10 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12d20 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12d30 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12d40 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12d50 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12d60 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12d70 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12d90 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12da0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12db0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12dc0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12de0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12df0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12e00 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12e10 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12e20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12e30 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12e40 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12e50 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12e60 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12e70 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12e80 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12e90 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12ea0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12eb0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12ec0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12ed0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12ee0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12ef0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
12f20 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
12f30 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
12f40 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
12f50 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
12f60 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
12f70 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
12fa0 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
12fb0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
12fc0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
12fd0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
12fe0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
12ff0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
13000 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
13010 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
13020 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13030 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
13040 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
13050 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
13060 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13070 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13080 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
13090 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
130a0 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
130b0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
130c0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
130d0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
130e0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
130f0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
13100 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
13110 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
13120 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
13130 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
13140 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
13150 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
13160 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
13170 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
13180 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
13190 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
131a0 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
131b0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
131c0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
131d0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
131e0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
131f0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
13200 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13210 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13220 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13230 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13240 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
13250 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
13260 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
13270 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
13280 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
13290 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
132a0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
132b0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
132c0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
132d0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
132e0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
132f0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
13300 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13310 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13320 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13330 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13340 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
13350 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
13360 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
13370 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
13380 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
13390 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
133a0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
133b0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
133c0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
133d0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
133e0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
133f0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
13400 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13410 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13420 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13430 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13440 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
13450 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
13460 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
13470 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
13480 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
13490 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
134a0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
134b0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
134c0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
134d0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
134e0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
134f0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
13500 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13510 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13520 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13530 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13540 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
13550 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
13560 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13570 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
13580 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
13590 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
135a0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
135b0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
135c0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
135d0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
135e0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
135f0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
13600 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13610 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13620 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13630 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13640 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
13650 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
13660 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
13670 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
13680 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
13690 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
136a0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
136b0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
136c0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
136d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
136e0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
136f0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
13700 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13710 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13720 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13730 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13740 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13750 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13760 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13770 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
13780 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
13790 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
137a0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
137b0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
137c0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
137d0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
137e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
137f0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
13800 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13810 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13820 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13830 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13840 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13850 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13860 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13870 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
13880 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13890 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
138a0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
138b0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
138c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
138d0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
138e0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
138f0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13900 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13910 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13920 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13930 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13940 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13950 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13960 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13970 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
13980 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
13990 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
139a0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
139b0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
139c0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
139d0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
139e0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
139f0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13a00 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13a10 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13a20 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13a30 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13a40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13a50 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13a60 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13a70 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
13a80 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
13a90 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
13aa0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13ab0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13ac0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13ad0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13ae0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13af0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13b00 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13b10 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13b20 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13b30 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13b40 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13b50 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13b60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13b70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
13b90 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
13ba0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13bb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13bc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13bd0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13bf0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13c00 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13c10 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13c20 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13c30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13c40 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13c50 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13c60 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13c70 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13c80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13c90 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13ca0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13cb0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13cc0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13cd0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13ce0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13cf0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13d00 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d20 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13d30 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13d40 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13d70 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13d80 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13d90 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13dc0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13dd0 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13de0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13df0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13e00 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13e10 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13e20 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13e50 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13e60 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13e70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e80 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13e90 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13ea0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13eb0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13ec0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13ed0 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13ee0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13ef0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13f00 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
13f10 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
13f20 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
13f30 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
13f40 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
13f50 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
13f60 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
13f70 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
13f80 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
13f90 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
13fa0 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
13fb0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
13fc0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
13fd0 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
13fe0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
13ff0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
14000 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
14010 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
14020 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
14030 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
14040 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
14050 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
14060 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
14070 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14080 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
14090 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
140a0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
140b0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
140c0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
140d0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
140e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
140f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
14100 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
14110 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
14120 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14130 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
14140 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
14150 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
14160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14170 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
14180 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14190 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
141a0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
141b0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
141c0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
141d0 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
141e0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
141f0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
14200 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14210 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14220 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14230 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14240 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14250 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14270 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14280 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
14290 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142b0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
142c0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142f0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
14300 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14310 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14320 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14330 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14340 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
14350 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14360 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
14370 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14380 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14390 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
143a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
143b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
143c0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
143d0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
143e0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
143f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
14400 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14410 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14420 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14430 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14440 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
14450 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
14460 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
14470 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
14480 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
14490 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
144a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
144b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
144c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
144d0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
144e0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
144f0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
14500 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14510 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14520 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14530 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14540 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
14550 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
14560 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
14570 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
14580 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
14590 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
145a0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
145b0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
145c0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
145d0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
145e0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
145f0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
14600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14610 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14620 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14630 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14640 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
14650 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
14660 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
14670 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
14680 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14690 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
146a0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
146b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
146c0 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
146d0 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
146e0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
146f0 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
14700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14710 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14720 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14730 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14740 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14760 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14770 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14780 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
14790 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
147a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
147b0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
147c0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
147d0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
147e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
147f0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
14800 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14810 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14820 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14830 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14840 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
14850 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
14860 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14870 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
14880 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
14890 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
148a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
148b0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
148c0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
148d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
148e0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
148f0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
14900 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14910 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14920 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14930 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14940 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14950 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14960 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
14970 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
14980 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14990 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
149a0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
149b0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
149c0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
149d0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
149e0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
149f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14a00 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14a10 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14a20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14a30 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14a40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14a50 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
14a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14a70 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14a80 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
14a90 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
14aa0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14ab0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14ac0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14ad0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14ae0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14af0 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14b00 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14b10 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14b30 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14b40 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
14b50 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
14b60 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
14b70 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
14b80 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
14b90 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14ba0 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14bb0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14bd0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14be0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14c00 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14c10 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14c20 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14c30 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14c40 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14c50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14c60 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14c70 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14c80 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14c90 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14ca0 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14cb0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14cc0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14cd0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14ce0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14cf0 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14d00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14d10 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14d20 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14d30 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14d40 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14d50 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14d70 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14d80 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14d90 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14da0 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14db0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14dc0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14dd0 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14de0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14df0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14e00 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14e10 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14e20 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14e30 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14e40 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14e50 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14e60 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14e70 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14e80 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14e90 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14ea0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14eb0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14ed0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14ef0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14f00 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14f10 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14f20 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
14f30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
14f40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
14f50 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
14f60 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
14f70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14f80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14f90 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
14fa0 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
14fb0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14fc0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14fe0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14ff0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
15000 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
15010 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
15020 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
15030 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
15040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15050 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
15060 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15070 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
15080 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
15090 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
150a0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
150b0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
150c0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
150d0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
150e0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
150f0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
15100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
15110 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
15120 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
15130 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
15140 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
15150 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
15160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
15170 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
15180 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
15190 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
151a0 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
151b0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
151c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
151d0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
151e0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
151f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15200 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15210 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15220 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15230 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
15250 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15290 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
152a0 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
152b0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
152c0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
152d0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
152e0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
152f0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
15300 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15310 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15320 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15340 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
15350 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
15360 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
15370 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
15380 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
15390 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
153a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
153b0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
153c0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
153d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
153e0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
153f0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
15400 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15410 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15420 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15430 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15440 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
15450 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
15460 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15470 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
15480 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
154b0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
154c0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
154d0 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
154e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15500 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15510 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15520 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15530 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15540 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15550 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
15560 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15570 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
15580 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15590 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
155a0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
155b0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
155c0 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
155d0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
155e0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
155f0 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
15600 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15610 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15620 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15630 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15640 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
15650 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15660 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
15670 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
15680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15690 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
156a0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
156b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156c0 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
156d0 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
156e0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
156f0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
15700 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15710 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15720 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15730 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15750 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15760 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
15770 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
15780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
157a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
157b0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
157c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
157d0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
157e0 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
157f0 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
15800 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15810 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15820 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15830 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15840 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15850 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
15860 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
15870 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
15880 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
15890 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
158a0 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
158b0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
158c0 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
158d0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
158e0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
158f0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
15900 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15910 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15920 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15930 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15940 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15950 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
15960 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
15970 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
15980 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
15990 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
159a0 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
159b0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
159c0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
159d0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
159e0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
159f0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15a00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15a10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15a20 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15a30 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15a40 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15a50 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
15a60 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
15a70 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
15a80 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
15a90 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
15aa0 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15ab0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15ac0 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15ad0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15ae0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15af0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15b00 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15b10 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15b30 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15b40 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15b50 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
15b60 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
15b70 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15b80 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
15b90 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
15ba0 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15bb0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15bc0 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
15bd0 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
15be0 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
15bf0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15c00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15c10 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
15c20 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
15c30 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
15c40 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15c50 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15c60 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15c70 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15c80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15c90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15ca0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15cc0 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15cd0 70 58 2c 20 69 54 61 62 2c 20 65 54 79 70 65 3d  pX, iTab, eType=
15ce0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
15cf0 3b 0a 20 20 20 20 69 66 28 20 72 4d 61 79 48 61  ;.    if( rMayHa
15d00 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
15d10 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15d20 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 72  lFlag(v, iTab, r
15d30 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
15d40 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
15d50 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
15d60 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
15d70 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26  }..  if( aiMap &
15d80 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15d90 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65  X_INDEX_ASC && e
15da0 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15db0 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
15dc0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
15dd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
15de0 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65  ctorSize(pX->pLe
15df0 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ft);.    for(i=0
15e00 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61  ; i<n; i++) aiMa
15e10 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  p[i] = i;.  }.  
15e20 2a 70 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  *piTab = iTab;. 
15e30 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
15e40 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
15e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15e60 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
15e70 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
15e80 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
15e90 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
15ea0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
15eb0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
15ec0 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
15ed0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
15ee0 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
15ef0 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
15f00 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
15f10 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
15f20 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
15f30 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
15f40 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15f50 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
15f60 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
15f70 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
15f80 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15f90 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
15fa0 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
15fb0 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
15fc0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15fd0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15fe0 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
15ff0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
16000 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
16010 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16020 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
16030 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
16040 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
16050 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
16060 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
16070 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
16080 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
16090 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
160a0 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
160b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
160c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
160d0 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
160e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
160f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
16100 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
16110 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
16120 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
16130 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
16140 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
16150 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
16160 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
16170 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
16180 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
16190 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
161a0 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
161b0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
161c0 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
161d0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
161e0 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
161f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
16200 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
16220 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
16230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16240 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
16250 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
16260 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
16270 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16280 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
16290 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
162a0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
162b0 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
162c0 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
162d0 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
162e0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
162f0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
16300 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16310 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
16320 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
16330 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
16340 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16350 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
16360 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
16370 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16380 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
16390 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
163a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
163b0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
163c0 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
163d0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
163e0 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
163f0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
16400 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
16410 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
16420 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
16430 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
16440 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
16450 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
16460 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16470 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
16480 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
16490 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
164a0 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
164b0 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
164c0 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
164d0 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
164e0 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
164f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
16500 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
16510 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
16520 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
16530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16540 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
16550 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
16560 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16570 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
16580 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
16590 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
165a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
165b0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
165c0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
165d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
165e0 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
165f0 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ed");.  }.}..#if
16600 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16610 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16620 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16630 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63  at will construc
16640 74 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  t an ephemeral t
16650 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
16660 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20  all terms.** in 
16670 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
16680 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
16690 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  IN operator can 
166a0 62 65 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  be in either of 
166b0 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a  two.** forms:.**
166c0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
166d0 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
166e0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
166f0 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
16700 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
16710 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
16720 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
16730 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
16740 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
16750 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
16760 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
16770 65 74 65 72 20 69 73 20 74 68 65 20 49 4e 20 6f  eter is the IN o
16780 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 63 75  perator.  The cu
16790 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
167a0 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  the.** construct
167b0 65 64 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61  ed ephermeral ta
167c0 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
167d0 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
167e0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a   the ephemeral.*
167f0 2a 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 75  * table is compu
16800 74 65 64 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ted, the cursor 
16810 6e 75 6d 62 65 72 20 69 73 20 61 6c 73 6f 20 73  number is also s
16820 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16830 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76  iTable,.** howev
16840 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  er the cursor nu
16850 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 6d 69  mber returned mi
16860 67 68 74 20 6e 6f 74 20 62 65 20 74 68 65 20 73  ght not be the s
16870 61 6d 65 2c 20 61 73 20 69 74 20 6d 69 67 68 74  ame, as it might
16880 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75  .** have been du
16890 70 6c 69 63 61 74 65 64 20 75 73 69 6e 67 20 4f  plicated using O
168a0 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a  P_OpenDup..**.**
168b0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
168c0 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
168d0 6f 2c 20 74 68 65 6e 20 4c 48 53 20 6f 66 20 74  o, then LHS of t
168e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
168f0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
16900 74 6f 20 62 65 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  to be a non-null
16910 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69   integer. In thi
16920 73 20 63 61 73 65 2c 20 74 68 65 20 65 70 68 65  s case, the ephe
16930 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 61 6e 20  meral table can 
16940 62 65 20 61 6e 0a 2a 2a 20 74 61 62 6c 65 20 42  be an.** table B
16950 2d 54 72 65 65 20 74 68 61 74 20 6b 65 79 65 64  -Tree that keyed
16960 20 62 79 20 6f 6e 6c 79 20 69 6e 74 65 67 65 72   by only integer
16970 73 2e 20 20 54 68 65 20 6d 6f 72 65 20 67 65 6e  s.  The more gen
16980 65 72 61 6c 20 63 61 73 65 73 20 75 73 65 73 0a  eral cases uses.
16990 2a 2a 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  ** an index B-Tr
169a0 65 65 20 77 68 69 63 68 20 63 61 6e 20 68 61 76  ee which can hav
169b0 65 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 73  e arbitrary keys
169c0 2c 20 62 75 74 20 69 73 20 73 6c 6f 77 65 72 20  , but is slower 
169d0 74 6f 20 62 6f 74 68 0a 2a 2a 20 72 65 61 64 20  to both.** read 
169e0 61 6e 64 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  and write..**.**
169f0 20 49 66 20 74 68 65 20 4c 48 53 20 65 78 70 72   If the LHS expr
16a00 65 73 73 69 6f 6e 20 28 22 78 22 20 69 6e 20 74  ession ("x" in t
16a10 68 65 20 65 78 61 6d 70 6c 65 73 29 20 69 73 20  he examples) is 
16a20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16a30 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  or.** the SELECT
16a40 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16a50 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16a60 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16a70 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nity of that.** 
16a80 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
16a90 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
16aa0 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16ab0 27 78 27 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53  'x' and the.** S
16ac0 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
16ad0 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
16ae0 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
16af0 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 2a 2a  inity is used.**
16b00 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16b10 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16b20 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16b30 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  y. If neither.**
16b40 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
16b50 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16b60 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16b70 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16b80 69 74 79 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a  ity.** is used..
16b90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
16ba0 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20 20 50 61  odeRhsOfIN(.  Pa
16bb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16bc0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16bd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16be0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
16c00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
16c10 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
16c20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
16c30 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  s cursor number 
16c40 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c60 49 66 20 74 72 75 65 2c 20 4c 48 53 20 69 73 20  If true, LHS is 
16c70 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
16c80 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
16c90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
16ca0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
16cb0 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
16cc0 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e  n at top */.  in
16cd0 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
16ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16cf0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
16d00 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
16d10 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
16d20 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
16d30 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48 53        /* the LHS
16d40 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16d50 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  tor */.  KeyInfo
16d60 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
16d70 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
16d80 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
16d90 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
16da0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16db0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
16dc0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
16df0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
16e00 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
16e10 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  /..  v = pParse-
16e20 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
16e30 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
16e40 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
16e50 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62 65  f the IN must be
16e60 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
16e70 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
16e80 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
16e90 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
16ea0 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
16eb0 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
16ec0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16ed0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
16ee0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
16ef0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
16f00 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
16f10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
16f20 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
16f30 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
16f40 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
16f50 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
16f60 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
16f70 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
16f80 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70  then we can comp
16f90 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73 74  ute the RHS just
16fa0 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72   once.  ** and r
16fb0 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d  euse it many nam
16fc0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
16fd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16fe0 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
16ff0 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d 3e  ect) && pParse->
17000 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20  iSelfTab==0 ){. 
17010 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20 74     /* Reuse of t
17020 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77 65  he RHS is allowe
17030 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  d */.    /* If t
17040 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
17050 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
17060 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65 76  ed, but the prev
17070 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a  ious code.    **
17080 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
17090 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74  been invoked yet
170a0 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e  , so invoke it n
170b0 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  ow as a subrouti
170c0 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ne. .    */.    
170d0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
170e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
170f0 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 61  brtn) ){.      a
17100 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
17110 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
17120 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
17130 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17140 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
17150 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17160 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
17170 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17180 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
17190 20 22 52 45 55 53 45 20 4c 49 53 54 20 53 55 42   "REUSE LIST SUB
171a0 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
171b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
171c0 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64  x.pSelect->selId
171d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
171e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
17200 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
17210 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20 20  gReturn,.       
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
17240 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
17250 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17260 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54 61   OP_OpenDup, iTa
17270 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  b, pExpr->iTable
17280 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17290 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
172a0 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
172b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
172c0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64      /* Begin cod
172d0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
172e0 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65  ne */.    ExprSe
172f0 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
17300 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20   EP_Subrtn);.   
17310 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
17320 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
17330 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45  se->nMem;.    pE
17340 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72  xpr->y.sub.iAddr
17350 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
17360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17370 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78  _Integer, 0, pEx
17380 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74  pr->y.sub.regRet
17390 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64  urn) + 1;.    Vd
173a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
173b0 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29 29  eturn address"))
173c0 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20  ;..    addrOnce 
173d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
173e0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
173f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
17410 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
17420 20 69 73 20 61 20 76 65 63 74 6f 72 20 49 4e 20   is a vector IN 
17430 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70 4c  operator */.  pL
17440 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17450 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71 6c  ft;.  nVal = sql
17460 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
17470 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 61 73 73  ze(pLeft);.  ass
17480 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c  ert( !isRowid ||
17490 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 2f   nVal==1 );..  /
174a0 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
174b0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
174c0 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69  that will contai
174d0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
174e0 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68 65  .  ** RHS of the
174f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
17500 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  */.  pExpr->iTab
17510 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64 64  le = iTab;.  add
17520 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17540 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
17550 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
17560 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c   (isRowid?0:nVal
17570 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
17580 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
17590 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20  _COMMENTS.  if( 
175a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
175b0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
175c0 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65  ect) ){.    Vdbe
175d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73  Comment((v, "Res
175e0 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75  ult of SELECT %u
175f0 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ", pExpr->x.pSel
17600 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  ect->selId));.  
17610 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43  }else{.    VdbeC
17620 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20  omment((v, "RHS 
17630 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29  of IN operator")
17640 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17650 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
17660 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
17670 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
17680 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
17690 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  );..  if( ExprHa
176a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
176b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
176c0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
176d0 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
176e0 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a  LECT ...).    **
176f0 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65  .    ** Generate
17700 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
17710 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
17720 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
17730 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
17740 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
17750 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
17760 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ove..    */.    
17770 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
17780 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
17790 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ct;.    ExprList
177a0 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
177b0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
177c0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
177d0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
177e0 73 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25  sLIST SUBQUERY %
177f0 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72  d",.        addr
17800 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41  Once?"":"CORRELA
17810 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e  TED ", pSelect->
17820 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20  selId.    ));.  
17830 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
17840 69 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  id );.    /* If 
17850 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20  the LHS and RHS 
17860 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17870 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c  or do not match,
17880 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 72 72   that.    ** err
17890 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
178a0 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
178b0 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
178c0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
178d0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
178e0 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29  st->nExpr==nVal)
178f0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
17900 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
17910 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
17920 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
17930 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
17940 65 74 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 20  et, iTab);.     
17950 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
17960 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
17970 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
17980 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
17990 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
179a0 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
179b0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
179c0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
179d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
179e0 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
179f0 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
17a00 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
17a10 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
17a20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
17a30 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
17a40 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
17a50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17a60 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17a70 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
17a90 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
17aa0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  nfo);.        re
17ab0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
17ac0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17ad0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
17ae0 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
17af0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
17b00 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
17b10 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
17b20 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
17b30 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
17b40 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
17b50 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
17b60 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
17b70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  r>0 );.      ass
17b80 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17b90 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17ba0 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
17bc0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
17bd0 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
17be0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
17bf0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
17c00 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
17c10 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
17c20 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
17c30 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20  eCollSeq(.      
17c40 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
17c50 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
17c60 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
17c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17c80 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
17c90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
17ca0 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  0) ){.    /* Cas
17cb0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
17cc0 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
17cd0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 65 61  **.    ** For ea
17ce0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
17cf0 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
17d00 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
17d10 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  ation and.    **
17d20 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
17d30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17d40 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
17d50 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
17d60 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f  e.    ** that co
17d70 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
17d80 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
17d90 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
17da0 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  r> is not.    **
17db0 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
17dc0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
17dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
17de0 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
17df0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
17e00 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
17e10 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 69 6e  the IN */.    in
17e20 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
17e30 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
17e40 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 73  ->x.pList;.    s
17e50 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17e60 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
17e70 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
17e80 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
17e90 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
17ea0 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  ty(pLeft);.    i
17eb0 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
17ec0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
17ed0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
17ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17ef0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17f10 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
17f20 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17f30 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
17f40 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
17f50 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
17f60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17f70 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eft);.    }..   
17f80 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17f90 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17fa0 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
17fb0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
17fc0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17fd0 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
17fe0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17ff0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  g(pParse);.    i
18000 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
18010 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18020 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32  , OP_Blob, 0, r2
18030 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
18040 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  IC);.    for(i=p
18050 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
18060 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
18070 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
18080 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32  .      Expr *pE2
18090 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
180a0 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54  .      int iValT
180b0 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oIns;..      /* 
180c0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
180d0 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
180e0 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
180f0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
18100 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
18110 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
18120 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
18130 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
18140 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
18150 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
18160 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
18170 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
18180 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
18190 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
181a0 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
181b0 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   time..      */.
181c0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e        if( addrOn
181d0 63 65 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  ce && !sqlite3Ex
181e0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
181f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
18200 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
18210 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 6e 63 65  Noop(v, addrOnce
18220 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  );.        addrO
18230 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
18240 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
18250 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
18260 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
18270 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
18280 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  able */.      if
18290 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
182a0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
182b0 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
182c0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  s) ){.        sq
182d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
182e0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
182f0 20 69 54 61 62 2c 20 72 32 2c 20 69 56 61 6c 54   iTab, r2, iValT
18300 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oIns);.      }el
18310 73 65 7b 0a 20 20 20 20 20 20 20 20 72 33 20 3d  se{.        r3 =
18320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18330 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
18340 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
18350 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
18360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18380 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
18390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
183b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
183c0 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
183d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
183e0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
183f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18400 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
18410 69 54 61 62 2c 20 72 32 2c 20 72 33 29 3b 0a 20  iTab, r2, r3);. 
18420 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18440 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18450 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
18460 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
18470 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
18480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18490 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
184a0 73 65 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20  sert, iTab, r2, 
184b0 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
184c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
184d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
184e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
184f0 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
18500 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18510 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
18520 7d 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  }.  if( pKeyInfo
18530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18540 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
18550 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
18560 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
18570 4f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64  O);.  }.  if( ad
18580 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71  drOnce ){.    sq
18590 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
185a0 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
185b0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
185c0 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  e return */.    
185d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
185e0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
185f0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18600 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c  Return);.    sql
18610 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
18620 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  (v, pExpr->y.sub
18630 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65  .iAddr-1, sqlite
18640 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18650 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  (v)-1);.  }.}.#e
18660 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18670 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
18680 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18690 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
186a0 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
186b0 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
186c0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45  pression.** or E
186d0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 3a 0a  XISTS operator:.
186e0 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
186f0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
18700 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
18710 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
18720 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
18730 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
18740 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  query.**.** The 
18750 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
18760 69 73 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  is the SELECT or
18770 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18780 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2a   to be coded..**
18790 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
187a0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
187b0 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d  result.  For a m
187c0 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45  ulti-column SELE
187d0 43 54 2c 20 0a 2a 2a 20 74 68 65 20 72 65 73 75  CT, .** the resu
187e0 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
187f0 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 72 72  a contiguous arr
18800 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
18810 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  and the.** retur
18820 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72  n value is the r
18830 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c  egister of the l
18840 65 66 74 2d 6d 6f 73 74 20 72 65 73 75 6c 74 20  eft-most result 
18850 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 52 65 74 75 72  column..** Retur
18860 6e 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72 20  n 0 if an error 
18870 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  occurs..*/.#ifnd
18880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
18890 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
188a0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
188b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
188c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
188d0 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
188e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
188f0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 6e 63  ddress of OP_Onc
18900 65 20 61 74 20 74 6f 70 20 6f 66 20 73 75 62 72  e at top of subr
18910 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18920 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rReg = 0;       
18930 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18940 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
18950 6c 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63  lting */.  Selec
18960 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
18970 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
18980 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
18990 63 6f 64 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  code */.  Select
189a0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
189b0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
189c0 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54  deal with SELECT
189d0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
189e0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
189f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18a00 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
18a10 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
18a20 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
18a30 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20     /* New limit 
18a40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20  expression */.. 
18a50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
18a60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
18a70 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 74 65  rt( v!=0 );.  te
18a80 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
18a90 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
18aa0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18ab0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18ad0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
18ae0 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
18af0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
18b00 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
18b10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18b20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18b30 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
18b40 78 2e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  x.pSelect;..  /*
18b50 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
18b60 6f 66 20 74 68 65 20 45 58 49 53 54 53 2f 53 45  of the EXISTS/SE
18b70 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72 65 70  LECT must be rep
18b80 65 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65  eated every time
18b90 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f   it.  ** is enco
18ba0 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f  untered if any o
18bb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
18bc0 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
18bd0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
18be0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
18bf0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
18c00 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
18c10 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
18c20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
18c30 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
18c40 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
18c50 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
18c60 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
18c70 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
18c80 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
18c90 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
18ca0 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
18cb0 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
18cc0 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
18cd0 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
18ce0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
18cf0 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
18d00 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
18d10 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
18d20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18d30 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
18d40 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72      /* If this r
18d50 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61  outine has alrea
18d60 64 79 20 62 65 65 6e 20 63 6f 64 65 64 2c 20 74  dy been coded, t
18d70 68 65 6e 20 69 6e 76 6f 6b 65 20 69 74 20 61 73  hen invoke it as
18d80 20 61 0a 20 20 20 20 2a 2a 20 73 75 62 72 6f 75   a.    ** subrou
18d90 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tine. */.    if(
18da0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18db0 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74  (pExpr, EP_Subrt
18dc0 6e 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  n) ){.      Expl
18dd0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18de0 61 72 73 65 2c 20 30 2c 20 22 52 45 55 53 45 20  arse, 0, "REUSE 
18df0 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 70 53  SUBQUERY %d", pS
18e00 65 6c 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  el->selId));.   
18e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18e20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
18e30 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
18e40 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  egReturn,.      
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
18e70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
18e80 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  urn pExpr->iTabl
18e90 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
18ea0 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74 68   Begin coding th
18eb0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  e subroutine */.
18ec0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
18ed0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
18ee0 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70 72  brtn);.    pExpr
18ef0 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
18f00 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
18f10 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79  em;.    pExpr->y
18f20 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20 20  .sub.iAddr =.   
18f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18f40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18f50 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79 2e  er, 0, pExpr->y.
18f60 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20 2b  sub.regReturn) +
18f70 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d   1;.    VdbeComm
18f80 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e 20  ent((v, "return 
18f90 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20 20  address"));..   
18fa0 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
18fb0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
18fc0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
18fd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18fe0 20 20 0a 20 20 2f 2a 20 46 6f 72 20 61 20 53 45    .  /* For a SE
18ff0 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
19000 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
19010 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
19020 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
19030 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
19040 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
19050 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
19060 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
19070 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
19080 67 69 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  gister..  **.  *
19090 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
190a0 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
190b0 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
190c0 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
190d0 69 73 74 73 29 0a 20 20 2a 2a 20 69 6e 74 6f 20  ists).  ** into 
190e0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
190f0 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
19100 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a  ter number..  **
19110 0a 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61  .  ** In both ca
19120 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
19130 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
19140 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
19150 20 0a 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69   .  ** preexisti
19160 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
19170 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
19180 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
19190 31 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 6c 61 69  1..  */.  Explai
191a0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
191b0 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c 41 52  se, 1, "%sSCALAR
191c0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
191d0 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f         addrOnce?
191e0 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
191f0 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29 3b  , pSel->selId));
19200 0a 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d  .  nReg = pExpr-
19210 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
19220 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
19230 45 78 70 72 20 3a 20 31 3b 0a 20 20 73 71 6c 69  Expr : 1;.  sqli
19240 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
19250 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
19260 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 70  se->nMem+1);.  p
19270 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
19280 52 65 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Reg;.  if( pExpr
19290 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
192a0 29 7b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  ){.    dest.eDes
192b0 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
192c0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
192d0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
192e0 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65  dest.nSdst = nRe
192f0 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  g;.    sqlite3Vd
19300 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
19310 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
19320 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61  Parm, dest.iSDPa
19330 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  rm+nReg-1);.    
19340 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19350 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
19360 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 65 6c 73  esult"));.  }els
19370 65 7b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  e{.    dest.eDes
19380 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
19390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
193a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
193b0 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
193c0 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43  Parm);.    VdbeC
193d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
193e0 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
193f0 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 6d 69 74 20  );.  }.  pLimit 
19400 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
19410 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
19420 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74  K_INTEGER,&sqlit
19430 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
19440 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  0);.  if( pSel->
19450 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
19460 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19470 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
19480 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29  ->pLimit->pLeft)
19490 3b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d  ;.    pSel->pLim
194a0 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d  it->pLeft = pLim
194b0 69 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  it;.  }else{.   
194c0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
194d0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
194e0 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70  rse, TK_LIMIT, p
194f0 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  Limit, 0);.  }. 
19500 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
19510 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
19520 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19530 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
19540 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19550 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
19560 20 3d 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69   = rReg = dest.i
19570 53 44 50 61 72 6d 3b 0a 20 20 45 78 70 72 53 65  SDParm;.  ExprSe
19580 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
19590 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
195a0 3b 0a 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65  ;.  if( addrOnce
195b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
195c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
195d0 64 64 72 4f 6e 63 65 29 3b 0a 0a 20 20 20 20 2f  ddrOnce);..    /
195e0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
195f0 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  urn */.    sqlit
19600 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19610 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70 72  OP_Return, pExpr
19620 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
19630 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
19640 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 70  dbeChangeP1(v, p
19650 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
19660 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  r-1, sqlite3Vdbe
19670 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
19680 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
19690 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
196a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
196b0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
196c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
196d0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
196e0 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
196f0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
19700 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
19710 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
19720 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
19730 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
19740 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
19750 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
19760 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
19770 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
19780 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
19790 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
197a0 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
197b0 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
197c0 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
197d0 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
197e0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
197f0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
19800 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19810 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
19820 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
19830 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
19840 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
19850 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
19860 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
19870 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
19880 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
19890 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
198a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
198b0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
198c0 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
198d0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
198e0 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
198f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19900 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
19910 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
19920 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
19930 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19940 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
19950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19960 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
19970 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
19980 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19990 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
199a0 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
199b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
199c0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
199d0 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
199e0 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
199f0 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
19a00 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
19a10 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
19a20 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
19a30 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
19a40 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
19a50 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
19a60 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
19a70 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
19a80 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
19a90 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
19aa0 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
19ab0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
19ac0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
19ad0 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
19ae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
19af0 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
19b00 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
19b10 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
19b20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
19b30 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
19b40 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
19b50 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
19b60 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
19b70 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
19b80 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
19b90 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
19ba0 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
19bb0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
19bc0 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
19bd0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
19be0 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
19bf0 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
19c00 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
19c10 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
19c20 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
19c30 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
19c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19c50 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
19c60 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
19c70 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
19c80 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
19c90 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
19ca0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
19cb0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
19cc0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
19cd0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
19ce0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
19cf0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
19d00 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
19d10 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
19d20 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
19d30 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
19d40 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
19d50 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
19d60 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
19d70 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
19d80 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
19d90 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
19da0 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
19db0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19dc0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
19dd0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
19de0 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
19df0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19e00 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
19e10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19e20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19e30 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19e40 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
19e50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
19e60 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
19e70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19e80 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
19e90 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
19ea0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
19eb0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
19ec0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
19ed0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
19ee0 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
19ef0 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
19f00 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
19f10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
19f20 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
19f30 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
19f40 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
19f50 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
19f60 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
19f70 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
19f80 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
19f90 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
19fa0 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
19fb0 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
19fc0 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
19fd0 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
19fe0 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
19ff0 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
1a000 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1a010 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1a020 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
1a030 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1a040 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
1a050 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
1a060 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
1a070 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
1a080 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
1a090 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
1a0a0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
1a0b0 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
1a0c0 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
1a0d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a0e0 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
1a0f0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
1a100 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
1a110 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
1a120 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
1a130 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
1a140 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
1a150 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1a160 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
1a170 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
1a180 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1a190 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
1a1a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
1a1b0 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
1a1c0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1a1d0 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
1a1e0 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
1a1f0 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
1a200 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
1a210 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
1a220 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
1a230 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
1a240 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
1a250 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
1a260 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
1a270 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
1a280 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
1a290 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
1a2a0 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
1a2b0 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
1a2c0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
1a2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
1a2e0 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
1a2f0 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69 54 61  op */ .  int iTa
1a300 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  b = 0;         /
1a310 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  * Index to use *
1a320 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78  /..  pLeft = pEx
1a330 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28  pr->pLeft;.  if(
1a340 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
1a350 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  kIN(pParse, pExp
1a360 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  r) ) return;.  z
1a370 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69  Aff = exprINAffi
1a380 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
1a390 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d  pr);.  nVector =
1a3a0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1a3b0 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
1a3c0 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20  eft);.  aiMap = 
1a3d0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d  (int*)sqlite3DbM
1a3e0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20  allocZero(.     
1a3f0 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65   pParse->db, nVe
1a400 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74  ctor*(sizeof(int
1a410 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29  ) + sizeof(char)
1a420 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28  ) + 1.  );.  if(
1a430 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a440 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
1a450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a460 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20  IN_oom_error;.. 
1a470 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63   /* Attempt to c
1a480 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
1a490 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
1a4a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   if anything oth
1a4b0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f  er than.  ** IN_
1a4c0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
1a4d0 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c  turned, the tabl
1a4e0 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 63 75  e opened with cu
1a4f0 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a 20 63  rsor iTab.  ** c
1a500 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
1a510 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
1a520 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
1a530 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
1a540 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
1a550 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
1a560 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
1a570 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1a580 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
1a590 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
1a5a0 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
1a5b0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
1a5c0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
1a5d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
1a5e0 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
1a5f0 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
1a600 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
1a610 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
1a640 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
1a650 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
1a680 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1a690 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
1a6a0 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20 20 20  HasNull,.       
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26 69 54        aiMap, &iT
1a6d0 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ab);..  assert( 
1a6e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1a6f0 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
1a700 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
1a710 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
1a720 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
1a730 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
1a740 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
1a750 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
1a760 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a770 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
1a780 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
1a790 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
1a7a0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1a7b0 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
1a7c0 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
1a7d0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1a7e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
1a7f0 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
1a800 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
1a810 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
1a820 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
1a830 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
1a840 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
1a850 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
1a860 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
1a870 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
1a880 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
1a890 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
1a8a0 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
1a8b0 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
1a8c0 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
1a8d0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1a8e0 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
1a8f0 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
1a900 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
1a910 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
1a920 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
1a930 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
1a940 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
1a950 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
1a960 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
1a970 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
1a980 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
1a990 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
1a9a0 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
1a9b0 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
1a9c0 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
1a9d0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
1a9e0 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
1a9f0 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
1aa00 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c 68 73  dex..  */.  rLhs
1aa10 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
1aa20 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
1aa30 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
1aa40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1aa50 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
1aa60 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
1aa70 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
1aa80 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
1aa90 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
1aaa0 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
1aab0 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
1aac0 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
1aad0 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
1aae0 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
1aaf0 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
1ab00 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
1ab10 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
1ab20 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
1ab30 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1ab40 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
1ab50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ab60 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1ab70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ab80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
1ab90 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
1aba0 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
1abb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1abc0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
1abd0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
1abe0 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
1abf0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
1ac00 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
1ac10 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
1ac20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
1ac30 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
1ac40 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
1ac50 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
1ac60 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
1ac70 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
1ac80 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
1ac90 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
1aca0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
1acb0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1acc0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
1acd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1ace0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1acf0 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
1ad00 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1ad10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1ad20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
1ad30 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
1ad40 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
1ad50 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1ad60 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65  ;.    int r2, re
1ad70 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74  gToFree;.    int
1ad80 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a   regCkNull = 0;.
1ad90 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1ada0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1adb0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1adc0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1add0 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
1ade0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1adf0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
1ae00 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
1ae10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1ae20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ae30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1ae40 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68  itAnd, rLhs, rLh
1ae50 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  s, regCkNull);. 
1ae60 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1ae70 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
1ae80 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1ae90 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1aea0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1aeb0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
1aec0 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
1aed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
1aee0 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
1aef0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1af00 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1af10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1af20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1af30 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
1af40 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
1af50 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
1af60 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
1af70 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
1af80 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1af90 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1afa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1afb0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
1afc0 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32  Lhs, labelOk, r2
1afd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1aff0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1b000 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
1b010 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1b020 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
1b030 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
1b040 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
1b050 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
1b060 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1b070 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1b080 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
1b090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b0a0 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
1b0b0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1b0c0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
1b0d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b0e0 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64  , OP_Ne, rLhs, d
1b0f0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1b120 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1b130 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
1b140 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
1b150 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1b160 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
1b170 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1b180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b190 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b1a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b1b0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
1b1c0 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
1b1d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1b1e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b1f0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
1b200 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
1b210 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1b220 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1b230 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1b240 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1b250 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1b260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b270 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
1b280 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b290 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b2a0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74  CkNull);.    got
1b2b0 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1b2c0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1b2d0 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20  }..  /* Step 2: 
1b2e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1b2f0 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73  the LHS contains
1b300 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   any NULL column
1b310 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
1b320 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  LHS does contain
1b330 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20   NULLs then the 
1b340 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65  result must be e
1b350 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e  ither FALSE or N
1b360 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ULL..  ** We wil
1b370 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  l then skip the 
1b380 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
1b390 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1b3a0 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
1b3b0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1b3c0 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
1b3d0 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1b3e0 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74  else{.    destSt
1b3f0 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20  ep2 = destStep6 
1b400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b410 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
1b420 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b430 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1b440 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
1b450 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1b460 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
1b470 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Left, i);.    if
1b480 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
1b490 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
1b4a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b4b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1b4c0 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53  l, rLhs+i, destS
1b4d0 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62  tep2);.      Vdb
1b4e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b4f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
1b500 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69  ep 3.  The LHS i
1b510 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62  s now known to b
1b520 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20  e non-NULL.  Do 
1b530 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1b540 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  h.  ** of the RH
1b550 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20  S using the LHS 
1b560 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20  as a probe.  If 
1b570 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c  found, the resul
1b580 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a  t is.  ** true..
1b590 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1b5a0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1b5b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
1b5c0 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
1b5d0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
1b5e0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
1b5f0 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20  d so we also.   
1b600 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   ** know that th
1b610 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c  e RHS is non-NUL
1b620 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f  L.  Hence, we co
1b630 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e  mbine steps 3 an
1b640 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  d 4.    ** into 
1b650 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
1b660 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1b670 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b680 53 65 65 6b 52 6f 77 69 64 2c 20 69 54 61 62 2c  SeekRowid, iTab,
1b690 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c   destIfFalse, rL
1b6a0 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  hs);.    VdbeCov
1b6b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
1b6c0 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1b6d0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1b6e0 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52   OP_Goto);  /* R
1b6f0 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20  eturn True */.  
1b700 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1b710 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b720 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68  OP_Affinity, rLh
1b730 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a  s, nVector, 0, z
1b740 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  Aff, nVector);. 
1b750 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c     if( destIfFal
1b760 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
1b770 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  {.      /* Combi
1b780 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74  ne Step 3 and St
1b790 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67  ep 5 into a sing
1b7a0 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  le opcode */.   
1b7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b7c0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
1b7d0 74 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 64 65  tFound, iTab, de
1b7e0 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b810 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b820 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
1b830 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1b840 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1b850 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
1b860 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
1b870 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
1b880 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
1b890 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
1b8a0 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1b8b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b8c0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
1b8d0 2c 20 69 54 61 62 2c 20 30 2c 0a 20 20 20 20 20  , iTab, 0,.     
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
1b910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
1b930 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20   4.  If the RHS 
1b940 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  is known to be n
1b950 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64  on-NULL and we d
1b960 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a  id not find.  **
1b970 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65   an match on the
1b980 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74   search above, t
1b990 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1b9a0 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20  ust be FALSE..  
1b9b0 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73  */.  if( rRhsHas
1b9c0 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d  Null && nVector=
1b9d0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
1b9e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b9f0 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
1ba00 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
1ba10 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
1ba20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1ba30 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66    /* Step 5.  If
1ba40 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1ba50 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72  about the differ
1ba60 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c  ence between NUL
1ba70 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45  L and.  ** FALSE
1ba80 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1ba90 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a  rn false. .  */.
1baa0 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
1bab0 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20  e==destIfNull ) 
1bac0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1bad0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1bae0 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c  ..  /* Step 6: L
1baf0 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73  oop through rows
1bb00 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f   of the RHS.  Co
1bb10 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74  mpare each row t
1bb20 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20  o the LHS..  ** 
1bb30 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  If any compariso
1bb40 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
1bb50 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
1bb60 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a  LL.  If all.  **
1bb70 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
1bb80 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20   FALSE then the 
1bb90 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20  final result is 
1bba0 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  FALSE..  **.  **
1bbb0 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48   For a scalar LH
1bbc0 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69  S, it is suffici
1bbd0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73  ent to check jus
1bbe0 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  t the first row.
1bbf0 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e    ** of the RHS.
1bc00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1bc10 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56  Step6 ) sqlite3V
1bc20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1bc30 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20  v, destStep6);. 
1bc40 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
1bc50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bc60 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1bc70 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1bc80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1bc90 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
1bca0 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74  1 ){.    destNot
1bcb0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1bcc0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1bcd0 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  se);.  }else{.  
1bce0 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72    /* For nVector
1bcf0 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65  ==1, combine ste
1bd00 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d  ps 6 and 7 by im
1bd10 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
1bd20 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45  ing.    ** FALSE
1bd30 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   if the first co
1bd40 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
1bd50 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74  NULL */.    dest
1bd60 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66  NotNull = destIf
1bd70 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72  False;.  }.  for
1bd80 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1bd90 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1bda0 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  *p;.    CollSeq 
1bdb0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
1bdc0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
1bdd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1bde0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
1bdf0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1be00 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
1be10 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1be20 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1be30 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  se, p);.    sqli
1be40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1be50 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
1be60 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71  , i, r3);.    sq
1be70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1be80 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69  v, OP_Ne, rLhs+i
1be90 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72  , destNotNull, r
1bea0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1beb0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1bec0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1bed0 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  Q);.    VdbeCove
1bee0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1bef0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1bf00 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
1bf10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1bf20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1bf30 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
1bf40 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  l);.  if( nVecto
1bf50 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
1bf60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1bf70 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  el(v, destNotNul
1bf80 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1bf90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bfa0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
1bfb0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65  Top+1);.    Vdbe
1bfc0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1bfd0 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66    /* Step 7:  If
1bfe0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1bff0 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
1c000 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  at the result mu
1c010 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c  st.    ** be fal
1c020 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  se. */.    sqlit
1c030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c040 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1c050 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20  IfFalse);.  }.. 
1c060 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69   /* Jumps here i
1c070 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72  n order to retur
1c080 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c  n true. */.  sql
1c090 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1c0a0 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29  (v, addrTruthOp)
1c0b0 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ;..sqlite3ExprCo
1c0c0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  deIN_finished:. 
1c0d0 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f   if( rLhs!=rLhsO
1c0e0 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  rig ) sqlite3Rel
1c0f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c100 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64 62  se, rLhs);.  Vdb
1c110 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
1c120 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71  d IN expr"));.sq
1c130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1c140 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  oom_error:.  sql
1c150 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1c160 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20  e->db, aiMap);. 
1c170 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1c180 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29  Parse->db, zAff)
1c190 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1c1a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c1b0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
1c1c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1c1d0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
1c1e0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1c1f0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1c200 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
1c210 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
1c220 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
1c230 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1c240 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1c250 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
1c260 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
1c270 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
1c280 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
1c290 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
1c2a0 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
1c2b0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
1c2c0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
1c2d0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
1c2e0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
1c2f0 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
1c300 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1c310 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
1c320 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1c330 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
1c340 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
1c350 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
1c360 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
1c370 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
1c380 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
1c390 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
1c3a0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
1c3b0 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
1c3c0 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
1c3d0 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
1c3e0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
1c3f0 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
1c400 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
1c410 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73   = -value;.    s
1c420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c430 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  Dup8(v, OP_Real,
1c440 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
1c450 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41  *)&value, P4_REA
1c460 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
1c470 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1c480 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c490 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c4a0 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
1c4b0 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
1c4c0 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
1c4d0 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
1c4e0 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
1c4f0 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
1c500 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
1c510 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1c520 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
1c530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c540 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c550 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
1c560 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
1c570 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1c580 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1c590 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1c5a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
1c5b0 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
1c5c0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
1c5d0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
1c5e0 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
1c5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c600 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c610 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
1c620 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
1c630 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
1c640 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c650 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
1c660 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
1c670 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
1c680 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1c690 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29  ToI64(z, &value)
1c6a0 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20  ;.    if( (c==3 
1c6b0 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20  && !negFlag) || 
1c6c0 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c  (c==2) || (negFl
1c6d0 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
1c6e0 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
1c6f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1c700 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1c710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1c720 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c730 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
1c740 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
1c750 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
1c760 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
1c770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
1c780 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
1c790 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
1c7a0 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
1c7b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c7c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c7d0 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
1c7e0 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
1c7f0 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
1c800 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
1c810 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
1c820 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1c830 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
1c840 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
1c850 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1c860 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
1c870 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33   ){ value = c==3
1c880 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
1c890 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
1c8a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c8b0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1c8c0 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
1c8d0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
1c8e0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
1c8f0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1c900 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c910 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
1c920 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
1c930 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
1c940 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1c950 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
1c960 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
1c970 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
1c980 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
1c990 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
1c9a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c9b0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1c9c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1c9d0 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
1c9e0 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
1c9f0 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
1ca00 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
1ca10 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
1ca20 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1ca30 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
1ca40 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
1ca50 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1ca60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
1ca70 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1ca80 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1ca90 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
1caa0 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
1cab0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1cac0 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
1cad0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
1cae0 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
1caf0 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e   if( iTabCol==XN
1cb00 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73  _EXPR ){.    ass
1cb10 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1cb20 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
1cb30 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1cb40 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c  r->nExpr>iIdxCol
1cb50 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1cb60 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43  iSelfTab = iTabC
1cb70 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69  ur + 1;.    sqli
1cb80 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
1cb90 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43  pParse, pIdx->aC
1cba0 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f  olExpr->a[iIdxCo
1cbb0 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74  l].pExpr, regOut
1cbc0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
1cbd0 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d  SelfTab = 0;.  }
1cbe0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1cbf0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1cc00 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1cc10 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1cc20 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1cc60 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1cc70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cc80 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1cc90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1cca0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1ccb0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1ccc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ccd0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1cce0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1ccf0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1cd00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1cd10 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1cd20 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1cd30 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1cd40 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1cd50 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1cd60 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1cd70 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1cd80 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1cd90 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1cda0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1cdb0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1cdc0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1cdd0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1cde0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1cdf0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1ce00 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1ce10 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
1ce20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1ce30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1ce40 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69  lumn, iTabCur, i
1ce50 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1ce60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ce70 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
1ce80 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
1ce90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1cea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1ceb0 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
1cec0 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1ced0 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
1cee0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
1cef0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
1cf00 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20  Column;.    int 
1cf10 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66  x = iCol;.    if
1cf20 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
1cf30 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
1cf40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78  pTab) ){.      x
1cf50 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1cf60 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50  OfIndex(sqlite3P
1cf70 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1cf80 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Tab), iCol);.   
1cf90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1cfa0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1cfb0 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f  iTabCur, x, regO
1cfc0 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ut);.  }.  if( i
1cfd0 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Col>=0 ){.    sq
1cfe0 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
1cff0 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
1d000 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1d010 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d020 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1d030 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
1d040 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
1d050 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
1d060 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
1d070 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1d080 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a 2a  egister iReg. .*
1d090 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1d0a0 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
1d0b0 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
1d0c0 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
1d0d0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1d0e0 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
1d0f0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
1d100 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
1d110 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
1d120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d130 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d140 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1d150 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
1d160 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d170 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d180 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1d190 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1d1a0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
1d1b0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
1d1c0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
1d1d0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
1d1e0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
1d1f0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
1d200 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1d210 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
1d220 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
1d230 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
1d240 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
1d250 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
1d260 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
1d270 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
1d280 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c  r OP_Column + FL
1d290 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  AGS */.){.  Vdbe
1d2a0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d2b0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
1d2c0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1d2d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d2e0 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
1d2f0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1d300 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
1d310 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
1d320 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d330 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   p5);.  }.  retu
1d340 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
1d350 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d360 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d370 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d380 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d390 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d3a0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
1d3b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d3c0 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1d3d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1d3e0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1d3f0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1d400 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1d410 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1d420 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1d430 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1d440 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1d450 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1d460 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , nReg);.}../*.*
1d470 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1d480 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1d490 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1d4a0 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1d4b0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1d4c0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1d4d0 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1d4e0 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1d4f0 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1d500 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1d510 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1d520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1d530 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1d540 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1d550 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1d560 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1d570 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1d580 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1d590 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1d5a0 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1d5b0 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1d5c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1d5d0 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1d5e0 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1d5f0 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1d600 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1d610 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1d620 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1d630 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1d640 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1d650 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1d660 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1d670 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1d680 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1d690 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1d6a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1d6b0 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1d6c0 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1d6d0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1d6e0 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1d6f0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1d700 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1d710 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1d720 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1d730 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1d740 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1d750 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1d760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1d770 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1d780 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d790 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1d7a0 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1d7b0 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1d7c0 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1d7d0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1d7e0 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1d7f0 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1d800 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d810 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1d820 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1d830 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1d840 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1d850 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1d860 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49  LECT ){.#if SQLI
1d870 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1d880 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1d890 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   0;.#else.      
1d8a0 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1d8b0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1d8c0 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64 69  Parse, p);.#endi
1d8d0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1d8e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1d8f0 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65  iResult = pParse
1d900 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1d910 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1d920 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66  nResult;.      f
1d930 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
1d940 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1d950 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d960 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73  Factorable(pPars
1d970 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  e, p->x.pList->a
1d980 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65  [i].pExpr, i+iRe
1d990 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
1d9a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d9b0 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n iResult;.}.../
1d9c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d9d0 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
1d9e0 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
1d9f0 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
1da00 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
1da10 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
1da20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
1da30 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
1da40 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1da50 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
1da60 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1da70 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
1da80 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
1da90 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
1daa0 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
1dab0 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
1dac0 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
1dad0 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
1dae0 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
1daf0 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
1db00 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
1db10 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
1db20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1db30 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
1db40 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
1db50 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
1db60 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
1db70 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
1db80 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1db90 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1dba0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1dbb0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1dbc0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1dbd0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1dbe0 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
1dbf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1dc00 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
1dc30 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1dc40 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
1dc50 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
1dc60 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
1dc70 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
1dc80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1dc90 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
1dca0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1dcb0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1dcc0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1dcd0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1dce0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1dcf0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1dd00 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1dd10 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1dd20 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20  1, r2;          
1dd30 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
1dd40 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1dd50 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58   */.  Expr tempX
1dd60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd70 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70  /* Temporary exp
1dd80 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a  ression node */.
1dd90 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20    int p5 = 0;.. 
1dda0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1ddb0 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1ddc0 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1ddd0 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
1dde0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1ddf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1de00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1de10 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f  .  }..expr_code_
1de20 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45  doover:.  if( pE
1de30 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
1de40 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
1de50 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
1de60 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
1de70 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1de80 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
1de90 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
1dea0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1deb0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1dec0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
1ded0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1dee0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1def0 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
1df00 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
1df10 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1df20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1df30 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
1df40 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
1df50 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20  rn pCol->iMem;. 
1df60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1df70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
1df80 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
1df90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dfa0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1dfb0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
1dfc0 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1dff0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
1e000 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e010 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
1e030 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
1e040 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
1e050 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
1e060 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e070 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1e080 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78    int iTab = pEx
1e090 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1e0a0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e0b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e0c0 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20  FixedCol) ){.   
1e0d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f 4c       /* This COL
1e0e0 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  UMN expression i
1e0f0 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73 74  s really a const
1e100 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52 45  ant due to WHERE
1e110 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
1e120 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ** constraints, 
1e130 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61 6e  and that constan
1e140 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74 68  t is coded by th
1e150 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20  e pExpr->pLeft. 
1e160 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
1e170 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72 2c  ssion.  However,
1e180 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   make sure the c
1e190 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65 20  onstant has the 
1e1a0 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20 20  correct.        
1e1b0 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20 61  ** datatype by a
1e1c0 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66 69  pplying the Affi
1e1d0 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62 6c  nity of the tabl
1e1e0 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 0a  e column to the.
1e1f0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1e200 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ant..        */.
1e210 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65 67          int iReg
1e220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e230 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1e240 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74 61   pExpr->pLeft,ta
1e250 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
1e260 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  nt aff = sqlite3
1e270 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
1e280 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54 61  ity(pExpr->y.pTa
1e290 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  b, pExpr->iColum
1e2a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1e2b0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
1e2c0 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
1e2d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e2e0 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c  har zAff[] = "B\
1e2f0 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b  000C\000D\000E";
1e300 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e310 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  t( SQLITE_AFF_BL
1e320 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20  OB=='A' );.     
1e330 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1e340 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42  ITE_AFF_TEXT=='B
1e350 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ' );.          i
1e360 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20  f( iReg!=target 
1e370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e390 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
1e3a0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1e3b0 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20           iReg = 
1e3c0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  target;.        
1e3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
1e3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e3f0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1e400 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20  iReg, 1, 0,.    
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61          &zAff[(a
1e430 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53  ff-'B')*2], P4_S
1e440 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1e450 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1e460 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20   iReg;.      }. 
1e470 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e480 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e490 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e4a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e4b0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e4c0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e4d0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e4e0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e4f0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e500 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e510 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e520 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e540 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e550 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e560 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e570 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e580 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e590 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e5a0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e5b0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e5c0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e5d0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e5e0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e5f0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e610 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e620 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e630 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70 54  rse, pExpr->y.pT
1e640 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
1e670 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c  n, iTab, target,
1e680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
1e6b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1e6c0 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1e6d0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1e6e0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
1e6f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e700 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e710 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1e720 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  UEFALSE: {.     
1e730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e740 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e750 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  , sqlite3ExprTru
1e760 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20  thValue(pExpr), 
1e770 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e780 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e790 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e7a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1e7b0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1e7c0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1e7d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e7e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e7f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e800 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1e810 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1e820 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1e830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e840 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1e850 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1e860 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1e870 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e880 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e890 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e8a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e8b0 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1e8c0 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1e8d0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65  Token);.      re
1e8e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e8f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1e900 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1e910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e920 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1e930 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e940 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e950 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e960 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1e970 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1e980 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1e990 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1e9a0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1e9b0 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1e9c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e9d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e9e0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e9f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ea00 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ea10 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1ea20 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1ea30 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1ea40 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1ea50 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1ea60 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1ea70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1ea80 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1ea90 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1eaa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1eab0 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1eac0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1ead0 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1eae0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1eaf0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1eb00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1eb10 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1eb20 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1eb30 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1eb40 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1eb50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1eb60 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1eb70 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1eb80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1eb90 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1eba0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ebb0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1ebc0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1ebd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ebe0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1ebf0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1ec00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ec10 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1ec20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1ec30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1ec40 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1ec50 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1ec60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ec70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  z = sqlite3VList
1ec80 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
1ec90 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d  ->pVList, pExpr-
1eca0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1ecb0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1ecc0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1ecd0 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78  ?' || strcmp(pEx
1ece0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29  pr->u.zToken, z)
1ecf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1ed00 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d  Parse->pVList[0]
1ed10 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74   = 0; /* Indicat
1ed20 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c  e VList may no l
1ed30 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65  onger be enlarge
1ed40 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1ed50 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1ed60 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34  (v, (char*)z, P4
1ed70 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1ed80 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
1ed90 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1eda0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1edb0 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
1edc0 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  n pExpr->iTable;
1edd0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ede0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1edf0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1ee00 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1ee10 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1ee20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1ee30 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1ee40 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1ee50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ee60 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1ee70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1ee80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1ee90 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1eea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eeb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1eec0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1eed0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1eee0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1eef0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ef00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ef10 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1ef20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ef40 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1ef50 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1ef60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ef70 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e  inReg;.    }.#en
1ef80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1ef90 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
1efa0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1efb0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
1efc0 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1efd0 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1efe0 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d  K_NE;.      p5 =
1eff0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
1f000 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68        /* fall-th
1f010 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
1f020 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f030 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f040 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f050 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f060 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f070 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f080 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1f090 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1f0a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1f0b0 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74  prIsVector(pLeft
1f0c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) ){.        cod
1f0d0 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70  eVectorCompare(p
1f0e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1f0f0 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20  rget, op, p5);. 
1f100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f110 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f120 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f130 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
1f140 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f150 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f160 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f170 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f180 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f190 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f1a0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1f1b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1f1c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31  ,.            r1
1f1d0 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
1f1e0 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35  ITE_STOREP2 | p5
1f1f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f200 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f210 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f220 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f230 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f240 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f250 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1f260 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f270 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1f280 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1f290 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f2a0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f2b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f2c0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f2d0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f2e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f2f0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1f300 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f310 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1f320 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1f330 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f340 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1f350 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f360 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1f370 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1f380 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f390 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1f3a0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f3b0 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1f3c0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1f3d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f3e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f3f0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f400 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f410 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1f420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f430 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f450 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
1f460 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1f470 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
1f480 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
1f490 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
1f4a0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
1f4b0 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
1f4c0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1f4d0 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
1f4e0 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
1f4f0 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
1f500 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1f510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f520 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
1f530 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
1f540 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
1f550 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1f560 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
1f570 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1f580 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f590 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
1f5a0 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
1f5b0 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
1f5c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f5d0 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
1f5e0 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
1f5f0 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
1f600 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
1f610 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
1f620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f630 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
1f640 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
1f650 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
1f660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f670 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
1f680 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
1f690 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1f6a0 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
1f6b0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
1f6c0 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
1f6d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f6e0 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
1f6f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
1f700 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
1f710 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
1f720 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
1f730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f740 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
1f750 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
1f760 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1f770 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1f780 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
1f790 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
1f7a0 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1f7b0 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
1f7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f7d0 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
1f7e0 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
1f7f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
1f800 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1f810 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f820 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f830 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f840 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1f850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f860 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f870 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1f880 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
1f890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f8a0 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
1f8b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
1f8c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f8d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f8e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f8f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f900 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f910 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
1f920 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1f930 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1f940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f950 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
1f960 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1f970 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
1f980 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
1f990 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
1f9a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f9b0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1f9c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f9d0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1f9e0 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
1f9f0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1fa00 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
1fa10 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1fa20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1fa30 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1fa40 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
1fa50 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
1fa60 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
1fa70 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1fa80 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69  rn target;.#endi
1fa90 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1faa0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
1fab0 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
1fac0 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
1fad0 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
1fae0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
1faf0 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
1fb00 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
1fb10 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fb20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fb30 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
1fb40 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1fb50 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1fb60 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fb70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fb80 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fb90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fba0 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
1fbb0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
1fbc0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
1fbd0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1fbe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1fbf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fc00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1fc10 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
1fc20 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
1fc30 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
1fc40 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
1fc50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fc60 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
1fc70 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
1fc80 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
1fc90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fca0 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
1fcb0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fcc0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fcd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fce0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fcf0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fd00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1fd10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fd20 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
1fd30 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
1fd40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fd50 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
1fd60 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20      int isTrue; 
1fd70 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
1fd80 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
1fd90 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d 61        int bNorma
1fda0 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  l;   /* IS TRUE 
1fdb0 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a 20  or IS FALSE */. 
1fdc0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fdd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fde0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fdf0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1fe00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe10 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1fe20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
1fe30 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
1fe40 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
1fe50 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61  t);.      bNorma
1fe60 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  l = pExpr->op2==
1fe70 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73  TK_IS;.      tes
1fe80 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
1fe90 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1fea0 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
1feb0 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1fec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fed0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1fee0 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52  _IsTrue, r1, inR
1fef0 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54  eg, !isTrue, isT
1ff00 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a  rue ^ bNormal);.
1ff10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ff20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ff30 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1ff40 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1ff50 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1ff60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1ff70 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1ff80 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1ff90 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1ffa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ffb0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1ffc0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1ffd0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1ffe0 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1fff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20000 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
20010 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
20020 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20030 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20040 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20050 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20060 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20070 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
20080 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
20090 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
200a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
200b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
200c0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
200d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
200e0 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
200f0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
20100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20110 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
20120 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
20130 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
20140 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
20150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20160 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
20170 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20180 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
20190 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
201a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
201b0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
201c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
201d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
201e0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
201f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20200 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20210 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
20220 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
20230 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
20240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20250 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
20260 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
20270 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
20280 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20290 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
202a0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
202b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
202c0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
202d0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
202e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
202f0 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
20300 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20310 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
20320 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
20330 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
20340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20350 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
20360 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
20370 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20380 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
20390 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
203a0 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
203b0 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
203c0 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
203d0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
203e0 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
203f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20420 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20430 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20440 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
20450 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
20460 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
20470 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
20480 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
20490 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
204a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
204b0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
204c0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
204d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
204e0 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
204f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
20500 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45  FUNC.      if( E
20510 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20520 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
20530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
20540 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  urn pExpr->y.pWi
20550 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20  n->regResult;.  
20560 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20570 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63      if( ConstFac
20580 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26  torOk(pParse) &&
20590 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
205a0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
205b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
205c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
205d0 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
205e0 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76  e. So try to mov
205f0 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74  e constant funct
20600 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ions.        ** 
20610 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
20620 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74   loop, even if t
20630 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74  hat means an ext
20640 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20  ra OP_Copy. */. 
20650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20660 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
20670 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
20680 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  r, -1);.      }.
20690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
206a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
206b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
206c0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
206d0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
206e0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
206f0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
20700 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
20710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20720 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
20730 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
20740 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
20750 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
20760 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
20770 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20780 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20790 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
207a0 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
207b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
207c0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
207d0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
207e0 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
207f0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
20800 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f  ITE_ENABLE_UNKNO
20810 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a  WN_SQL_FUNCTION.
20820 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
20830 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70  0 && pParse->exp
20840 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
20850 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20860 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  ndFunction(db, "
20870 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c  unknown", nFarg,
20880 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
20890 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
208a0 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
208b0 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
208c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
208d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
208e0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
208f0 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49  ction: %s()", zI
20900 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
20910 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20920 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
20930 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
20940 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
20950 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
20960 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
20970 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
20980 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
20990 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
209a0 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
209b0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
209c0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
209d0 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
209e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
209f0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20a00 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
20a10 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
20a20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
20a30 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
20a40 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
20a50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20a60 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
20a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20a80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
20a90 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20aa0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20ab0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
20ac0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ae0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
20af0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
20b00 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
20b10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20b20 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
20b40 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20b50 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
20b60 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
20b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20b80 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20b90 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
20ba0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20bc0 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
20bd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20be0 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
20bf0 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
20c00 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
20c10 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
20c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20c30 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20c40 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
20c50 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
20c60 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20c70 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =1 );.        re
20c80 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
20c90 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20ca0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
20cb0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20cc0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
20cd0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20ce0 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54    /* The AFFINIT
20cf0 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61  Y() function eva
20d00 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72 69  luates to a stri
20d10 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
20d20 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74  s.      ** the t
20d30 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  ype affinity of 
20d40 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  the argument.  T
20d50 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
20d60 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20  testing of.     
20d70 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74   ** the SQLite t
20d80 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20  ype logic..     
20d90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20da0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20db0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49  SQLITE_FUNC_AFFI
20dc0 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20  NITY ){.        
20dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66  const char *azAf
20de0 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20  f[] = { "blob", 
20df0 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63  "text", "numeric
20e00 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
20e10 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  eal" };.        
20e20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
20e30 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
20e40 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66  =1 );.        af
20e50 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
20e60 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61  ffinity(pFarg->a
20e70 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
20e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
20e90 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
20ea0 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  get, .          
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b      aff ? azAff[
20ed0 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  aff-SQLITE_AFF_B
20ee0 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a  LOB] : "none");.
20ef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
20f00 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23  arget;.      }.#
20f10 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72  endif..      for
20f20 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
20f30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
20f40 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
20f50 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
20f60 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20f70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
20f80 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
20f90 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
20fa0 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
20fb0 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
20fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20fd0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20fe0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
20ff0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
21000 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
21010 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21020 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
21030 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
21040 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
21050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21060 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
21070 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
21080 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
21090 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
210a0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
210b0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
210c0 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
210d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
210e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
210f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
21100 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
21110 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
21120 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
21130 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
21140 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
21150 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
21160 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
21170 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
21180 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
21190 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
211a0 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
211b0 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
211c0 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
211d0 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
211e0 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
211f0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
21200 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21210 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
21220 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
21230 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
21240 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
21250 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
21260 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
21270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21280 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
21290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
212a0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
212b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
212c0 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
212d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
212e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
212f0 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
21300 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
21310 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
21320 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21330 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
21340 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
21350 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
21360 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
21370 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
21380 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
21390 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
213a0 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
213b0 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
213c0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
213d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
213e0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
213f0 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
21400 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
21410 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
21420 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
21430 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
21440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21450 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
21460 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21470 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21480 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
214b0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
214c0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
214d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
214e0 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
214f0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21500 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
21510 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
21520 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
21530 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
21540 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
21550 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
21560 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21570 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
21580 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
21590 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
215a0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
215b0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
215c0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
215d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
215e0 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
215f0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
21600 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
21610 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
21620 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
21630 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
21640 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
21650 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
21660 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
21670 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
21680 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
21690 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
216a0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
216b0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
216c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
216d0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
216e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
216f0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
21700 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
21710 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
21720 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
21730 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
21740 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
21750 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
21760 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
21770 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
21780 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
21790 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
217a0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
217b0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
217c0 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  >=2 && ExprHasPr
217d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
217e0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
217f0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
21800 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
21810 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
21820 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
21830 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
21840 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
21850 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
21860 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
21870 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
21880 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
21890 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
218a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
218b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
218c0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
218d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
218e0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
218f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
21900 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
21910 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
21920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21930 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
21940 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
21950 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
21960 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
21970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21980 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
21990 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70  FUNC.      if( p
219a0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
219b0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46   SQLITE_FUNC_OFF
219c0 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45  SET ){.        E
219d0 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72  xpr *pArg = pFar
219e0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  g->a[0].pExpr;. 
219f0 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
21a00 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21a10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21a20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21a30 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67   OP_Offset, pArg
21a40 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e  ->iTable, pArg->
21a50 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
21a60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21a70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21a90 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
21aa0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
21ab0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21ac0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
21ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21ae0 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69  Op4(v, pParse->i
21af0 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72  SelfTab ? OP_Pur
21b00 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63  eFunc0 : OP_Func
21b10 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20  tion0,.         
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
21b40 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70  target, (char*)p
21b50 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
21b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21b70 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21b80 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
21b90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21ba0 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
21bb0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
21bc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21bd0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21be0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
21bf0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21c00 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21c20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
21c30 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
21c40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
21c50 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
21c60 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
21c70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
21c80 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
21c90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
21ca0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21cb0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21cc0 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
21cd0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
21ce0 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
21cf0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21d00 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
21d10 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
21d20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21d30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
21d40 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21d50 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21d80 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
21d90 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
21da0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66   int n;.      if
21db0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ( pExpr->pLeft->
21dc0 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  iTable==0 ){.   
21dd0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
21de0 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  t->iTable = sqli
21df0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
21e00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21e10 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
21e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
21e30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
21e40 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
21e50 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21e60 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21e70 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
21e80 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
21e90 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
21ea0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
21eb0 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
21ec0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
21ed0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21ee0 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
21ef0 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
21f00 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
21f30 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
21f40 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
21f50 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
21f60 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
21f70 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
21f80 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
21f90 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
21fa0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
21fb0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
21fc0 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  e);.      int de
21fd0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
21fe0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21ff0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
22000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22010 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
22020 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22030 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
22040 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22050 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
22060 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
22070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22080 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22090 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
220a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
220b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
220c0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
220d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
220e0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
220f0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
22100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22110 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
22120 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
22130 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
22140 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
22150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
22160 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
22170 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
22180 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
22190 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
221a0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
221b0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
221c0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
221d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
221e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
221f0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
22200 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
22210 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22220 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
22230 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
22240 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22250 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
22260 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
22270 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
22280 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
22290 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
222a0 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20  arget, 0, 0);.  
222b0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
222c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
222d0 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
222e0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
222f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
22300 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70  US: {.      pExp
22310 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  r = pExpr->pLeft
22320 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70  ;.      goto exp
22330 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20 2f  r_code_doover; /
22340 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50 72  * 2018-04-28: Pr
22350 65 76 65 6e 74 20 64 65 65 70 20 72 65 63 75 72  event deep recur
22360 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20 2a  sion. OSSFuzz. *
22370 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  /.    }..    cas
22380 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
22390 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
223a0 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
223b0 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
223c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
223d0 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
223e0 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
223f0 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
22400 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22410 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
22420 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
22430 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
22440 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
22450 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
22460 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
22470 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
22480 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
22490 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
224a0 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
224b0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
224c0 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
224d0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
224e0 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
224f0 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
22500 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
22510 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a   field..      **
22520 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78  .      ** The ex
22530 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c  pression is impl
22540 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e  emented using an
22550 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65   OP_Param opcode
22560 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a  . The p1.      *
22570 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  * parameter is s
22580 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f  et to 0 for an o
22590 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ld.rowid referen
225a0 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a  ce, or to (i+1).
225b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65        ** to refe
225c0 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f  rence another co
225d0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e  lumn of the old.
225e0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
225f0 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  where .      ** 
22600 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  i is the index o
22610 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f  f the column. Fo
22620 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65  r a new.rowid re
22630 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20  ference, p1 is. 
22640 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28       ** set to (
22650 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73  n+1), where n is
22660 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
22670 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70  olumns in each p
22680 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20  seudo-table..   
22690 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65     ** For a refe
226a0 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68  rence to any oth
226b0 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  er column in the
226c0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
226d0 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a  ble, p1.      **
226e0 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b   is set to (n+2+
226f0 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20  i), where n and 
22700 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64  i are as defined
22710 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72   previously. For
22720 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  .      ** exampl
22730 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
22740 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72  on which trigger
22750 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65  s are being fire
22760 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  d is.      ** de
22770 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20  clared as:.     
22780 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43   **.      **   C
22790 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
227a0 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20  , b);.      **. 
227b0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20       ** Then p1 
227c0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
227d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
227e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70   **.      **   p
227f0 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==0   ->    old
22800 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33  .rowid     p1==3
22810 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77     ->    new.row
22820 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  id.      **   p1
22830 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==1   ->    old.
22840 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20  a         p1==4 
22850 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20    ->    new.a.  
22860 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20      **   p1==2  
22870 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20   ->    old.b    
22880 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20       p1==5   -> 
22890 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a     new.b       .
228a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
228b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
228c0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
228d0 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
228e0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
228f0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
22900 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
22910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22920 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
22930 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
22940 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
22950 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
22960 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
22970 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
22980 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
22990 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
229a0 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
229b0 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
229c0 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
229d0 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
229e0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
229f0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
22a00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22a10 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
22a20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
22a30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 5b  eComment((v, "r[
22a40 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72 67  %d]=%s.%s", targ
22a50 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  et,.        (pEx
22a60 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
22a70 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
22a80 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
22a90 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
22aa0 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   : pExpr->y.pTab
22ab0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22ac0 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20  olumn].zName).  
22ad0 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
22ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
22af0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
22b00 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
22b10 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
22b20 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
22b30 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
22b40 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
22b50 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
22b60 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
22b70 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
22b80 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
22b90 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
22ba0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
22bb0 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
22bc0 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
22bd0 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
22be0 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
22bf0 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
22c00 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
22c10 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
22c20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
22c30 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
22c40 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
22c50 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
22c60 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
22c70 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
22c80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
22c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22ca0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
22cb0 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
22cc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22ce0 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
22cf0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
22d00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22d10 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
22d20 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
22d30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
22d40 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
22d50 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ROW: {.      in
22d60 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20  t addrINR;.     
22d70 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74   addrINR = sqlit
22d80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
22d90 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45  OP_IfNullRow, pE
22da0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
22db0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
22dc0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
22dd0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
22de0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
22df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22e00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
22e10 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71  drINR);.      sq
22e20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22e30 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e  3(v, addrINR, in
22e40 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
22e50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
22e60 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
22e70 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
22e80 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
22e90 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
22ea0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
22eb0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22ec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
22ed0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
22ee0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
22ef0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
22f00 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
22f10 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
22f20 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
22f30 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
22f40 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
22f50 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
22f60 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
22f70 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
22f80 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
22f90 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
22fa0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
22fb0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
22fc0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22fd0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22fe0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
22ff0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
23000 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
23010 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
23020 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
23030 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
23040 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
23050 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
23060 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
23070 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
23080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
23090 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
230a0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
230b0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
230c0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
230d0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
230e0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
230f0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
23100 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
23110 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
23120 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
23130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23140 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
23150 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
23160 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
23170 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
23180 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
23190 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
231a0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
231b0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
231c0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
231d0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
231e0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
231f0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
23200 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
23210 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
23240 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
23250 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
23260 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
23290 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
232a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
232b0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
232e0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
232f0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23320 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
23330 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
23360 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
23370 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23380 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
23390 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
233a0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
233b0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
233c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
233d0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
233e0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
233f0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
23420 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
23430 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
23440 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23450 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
23460 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
23470 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a  Ei (form B) */..
23480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23490 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
234a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
234b0 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
234c0 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
234d0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
234e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
234f0 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
23500 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
23510 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
23520 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
23530 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
23540 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
23550 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
23560 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
23570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23580 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
23590 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
235a0 20 20 20 20 20 20 65 78 70 72 4e 6f 64 65 43 6f        exprNodeCo
235b0 70 79 28 26 74 65 6d 70 58 2c 20 70 58 29 3b 0a  py(&tempX, pX);.
235c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
235d0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
235e0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
235f0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
23600 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
23610 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
23620 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
23630 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23640 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23650 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23660 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
23670 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
23680 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
23690 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
236a0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
236b0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
236c0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
236d0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
236e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
236f0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
23700 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23710 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23720 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23730 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23740 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23750 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23760 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23770 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23780 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
23790 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
237a0 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
237b0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
237c0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
237d0 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
237e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
237f0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
23800 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
23810 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
23820 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
23830 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
23840 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
23850 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
23860 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
23870 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23880 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
23890 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
238a0 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
238b0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
238c0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
238d0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
238e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
238f0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  se);.        tes
23900 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
23910 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23930 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23940 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
23950 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
23960 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
23970 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23980 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
23990 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
239a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
239b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
239c0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
239d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
239e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
239f0 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
23a00 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23a10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23a20 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
23a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23a40 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
23a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23a60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23a70 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23a80 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23a90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
23aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23ac0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
23ad0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
23ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23af0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23b00 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
23b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
23b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23b30 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
23b40 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
23b50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
23b60 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23b70 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
23b80 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23b90 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
23ba0 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
23bb0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23bc0 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
23bd0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
23be0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
23bf0 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
23c00 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
23c10 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
23c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23c30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
23c60 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
23c70 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
23c80 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
23c90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23ca0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23cb0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23cc0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
23cd0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
23ce0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
23cf0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
23d00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23d10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
23d20 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23d30 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
23d40 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
23d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23d60 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
23d70 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
23d80 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
23d90 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
23da0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
23db0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
23dc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
23dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23de0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
23df0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
23e00 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e10 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
23e40 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
23e50 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
23e60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23e70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
23e80 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
23e90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23ea0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
23eb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
23ec0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23ed0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
23ee0 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
23ef0 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
23f00 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
23f10 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
23f20 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
23f30 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  tion time..**.**
23f40 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74   If regDest>=0 t
23f50 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
23f60 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
23f70 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
23f80 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75   and the.** resu
23f90 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62  lt is not reusab
23fa0 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c  le.  If regDest<
23fb0 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
23fc0 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a  ine is free to .
23fd0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  ** store the val
23fe0 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20  ue whereever it 
23ff0 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  wants.  The regi
24000 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65  ster where the e
24010 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73  xpression .** is
24020 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72   stored is retur
24030 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65  ned.  When regDe
24040 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69  st<0, two identi
24050 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  cal expressions 
24060 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  will.** code to 
24070 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
24080 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
24090 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
240a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
240b0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
240c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
240d0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
240e0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
240f0 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
24100 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
24110 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
24120 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  est       /* Sto
24130 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
24140 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
24150 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
24160 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
24170 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
24180 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
24190 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
241a0 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
241b0 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  && p ){.    stru
241c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
241d0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74   *pItem;.    int
241e0 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   i;.    for(pIte
241f0 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
24200 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
24210 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  , i--){.      if
24220 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
24230 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
24240 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d  Compare(0,pItem-
24250 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
24260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
24270 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69  eturn pItem->u.i
24280 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20  ConstExprReg;.  
24290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
242a0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
242b0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
242c0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
242d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
242e0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
242f0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
24300 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
24310 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24320 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
24330 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
24340 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
24350 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30  able = regDest<0
24360 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65  ;.     if( regDe
24370 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d  st<0 ) regDest =
24380 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
24390 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
243a0 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
243b0 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50  egDest;.  }.  pP
243c0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
243d0 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72   = p;.  return r
243e0 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egDest;.}../*.**
243f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24400 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
24410 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
24420 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
24430 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
24440 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
24450 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
24460 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
24470 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
24480 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
24490 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
244a0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
244b0 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
244c0 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
244d0 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
244e0 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
244f0 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
24500 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
24510 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
24520 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
24530 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
24540 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
24550 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24560 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
24570 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
24580 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
24590 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
245a0 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
245b0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
245c0 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
245d0 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
245e0 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
245f0 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
24600 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
24610 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
24620 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24630 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
24640 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
24650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
24660 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
24670 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
24680 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
24690 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
246a0 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
246b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
246c0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
246d0 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  xpr).  ){.    *p
246e0 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32  Reg  = 0;.    r2
246f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24700 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24710 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d   pExpr, -1);.  }
24720 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
24730 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
24740 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
24750 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24760 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
24770 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
24780 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
24790 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
247a0 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
247b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
247c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
247d0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
247e0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
247f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
24800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24810 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
24820 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
24830 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
24840 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
24850 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
24860 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
24870 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
24880 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
24890 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
248a0 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
248b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
248c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
248d0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
248e0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
248f0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
24900 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
24910 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
24920 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
24930 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
24940 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
24950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24960 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
24970 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
24980 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
24990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
249a0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
249b0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
249c0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
249d0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
249e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
249f0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
24a00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24a10 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
24a20 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
24a30 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
24a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24a50 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24a60 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
24a70 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
24a80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
24a90 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
24aa0 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
24ab0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
24ac0 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
24ad0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
24ae0 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
24af0 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
24b00 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
24b10 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
24b20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
24b30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
24b40 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
24b50 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
24b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b70 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
24b80 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24b90 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24ba0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24bb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
24bc0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
24bd0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
24be0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
24bf0 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
24c00 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24c10 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24c20 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
24c30 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
24c40 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
24c50 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
24c60 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
24c70 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
24c80 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
24c90 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
24ca0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
24cb0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
24cc0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
24cd0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
24ce0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
24cf0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
24d00 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
24d10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
24d20 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
24d30 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
24d40 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
24d50 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
24d60 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24d70 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
24d80 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24d90 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24da0 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
24db0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
24dc0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
24dd0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
24de0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
24df0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24e00 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24e10 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
24e20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
24e30 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24e40 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
24e60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24e70 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
24e80 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
24e90 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
24ea0 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
24eb0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
24ec0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
24ed0 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
24ee0 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
24ef0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
24f00 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
24f10 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
24f20 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
24f30 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
24f40 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
24f50 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
24f60 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
24f70 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
24f80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24f90 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
24fa0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
24fb0 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
24fc0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
24fd0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
24fe0 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
24ff0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
25000 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
25010 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
25020 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
25030 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
25040 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
25050 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
25060 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25070 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
25080 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
25090 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
250a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
250b0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
250c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
250d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
250e0 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
250f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
25100 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
25110 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
25120 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
25130 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
25140 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
25150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25160 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
25170 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
25180 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
25190 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
251a0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
251b0 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
251c0 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
251d0 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
251e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
251f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
25200 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20  ents evaluated. 
25210 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
25220 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75  rned will.** usu
25230 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e  ally be pList->n
25240 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62  Expr but might b
25250 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c  e reduced if SQL
25260 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25270 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  .** is defined..
25280 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25290 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
252a0 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
252b0 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
252c0 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
252d0 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
252e0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
252f0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
25300 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25310 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
25320 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
25330 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
25340 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
25350 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
25360 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
25370 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25380 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
25390 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
253a0 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
253b0 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
253c0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
253d0 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
253e0 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
253f0 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
25400 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
25410 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
25420 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
25430 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
25440 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45  ** If SQLITE_ECE
25450 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73  L_OMITREF is als
25460 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  o set, then the 
25470 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e  values with u.x.
25480 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a  iOrderByCol>0.**
25490 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74   are simply omit
254a0 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
254b0 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f  being copied fro
254c0 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74  m srcReg..*/.int
254d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
254e0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
254f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
25500 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25510 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
25520 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
25530 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25540 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
25550 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
25560 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
25570 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
25580 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
25590 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
255a0 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
255b0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
255c0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
255d0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
255e0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
255f0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
25600 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
25610 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
25620 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
25630 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25640 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
25650 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
25660 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25670 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
25680 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
25690 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
256a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
256b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
256c0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
256d0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
256e0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
256f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
25700 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
25710 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
25720 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
25730 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
25740 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
25750 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
25760 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
25770 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
25780 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20  ->pExpr;.#ifdef 
25790 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
257a0 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
257b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62      if( pItem->b
257c0 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
257d0 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d     i--;.      n-
257e0 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  -;.    }else.#en
257f0 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61  dif.    if( (fla
25800 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25810 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
25820 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
25830 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
25840 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
25850 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
25860 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
25870 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
25880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
258a0 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
258b0 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
258c0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
258d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
258e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
258f0 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a  ECEL_FACTOR)!=0.
25900 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
25910 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25920 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
25930 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
25940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
25950 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
25960 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
25970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25980 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
25990 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
259a0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
259b0 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
259c0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
259d0 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
259e0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
259f0 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
25a00 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25a10 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
25a20 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
25a30 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
25a40 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
25a50 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
25a60 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
25a70 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
25a80 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
25a90 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
25aa0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
25ab0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25ac0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25ae0 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
25af0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25b00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25b10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
25b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25b30 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
25b40 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
25b50 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
25b60 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
25b70 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
25b80 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
25b90 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
25ba0 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
25bb0 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
25bc0 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
25bd0 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
25be0 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
25bf0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
25c00 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
25c10 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
25c20 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
25c30 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
25c50 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
25c60 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
25c70 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
25c80 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
25c90 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
25ca0 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
25cb0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
25cc0 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
25cd0 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
25ce0 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
25cf0 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
25d00 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
25d10 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
25d20 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
25d30 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
25d40 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
25d50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
25d60 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
25d70 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
25d80 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
25d90 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
25da0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
25db0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
25dc0 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
25dd0 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
25de0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
25df0 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
25e00 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
25e10 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
25e20 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
25e30 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
25e40 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
25e50 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
25e60 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e  .){. Expr exprAn
25e70 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
25e80 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
25e90 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
25ea0 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
25eb0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
25ec0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
25ed0 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
25ee0 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
25ef0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
25f00 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
25f10 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
25f20 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
25f30 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
25f40 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
25f50 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  er */..  memset(
25f60 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
25f70 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
25f80 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
25f90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25fa0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
25fb0 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
25fc0 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
25fd0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25fe0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
25ff0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
26000 78 70 72 4e 6f 64 65 43 6f 70 79 28 26 65 78 70  xprNodeCopy(&exp
26010 72 58 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rX, pExpr->pLeft
26020 29 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  );.  exprAnd.op 
26030 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
26040 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
26050 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
26060 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
26070 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
26080 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
26090 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
260a0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
260b0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
260c0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
260d0 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
260e0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
260f0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
26100 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
26110 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
26120 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
26130 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
26140 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
26150 78 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65  xprX, exprCodeVe
26160 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78  ctor(pParse, &ex
26170 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
26180 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b  ;.  if( xJump ){
26190 0a 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73  .    xJump(pPars
261a0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
261b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
261c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
261d0 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
261e0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
261f0 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
26200 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
26210 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  in.    ** so tha
26220 74 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  t the sqlite3Exp
26230 72 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f  rCodeTarget() ro
26240 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61  utine will not a
26250 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20  ttempt to move. 
26260 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68     ** it into th
26270 65 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78  e Parse.pConstEx
26280 70 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f  pr list.  We sho
26290 75 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69  uld use a new bi
262a0 74 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20  t for this,.    
262b0 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20  ** for clarity, 
262c0 62 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f  but we are out o
262d0 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78  f bits in the Ex
262e0 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73  pr.flags field s
262f0 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65  o we.    ** have
26300 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50   to reuse the EP
26310 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20  _FromJoin bit.  
26320 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65  Bummer. */.    e
26330 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
26340 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
26350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
26360 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
26370 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
26380 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
26390 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
263a0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
263b0 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
263c0 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
263d0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
263e0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
263f0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
26400 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26410 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
26420 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26430 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26440 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
26450 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
26460 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26470 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26480 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26490 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
264a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
264b0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
264c0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
264d0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
264e0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
264f0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
26500 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26510 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
26520 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26530 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
26540 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26550 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26560 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
26570 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26580 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
26590 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
265a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
265b0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
265c0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
265d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
265e0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
265f0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26600 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26610 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
26620 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30  stcase( xJump==0
26630 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
26640 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26650 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
26660 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
26670 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
26680 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
26690 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
266a0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
266b0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
266c0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
266d0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
266e0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
266f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26700 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
26710 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
26720 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
26730 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
26740 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
26750 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
26760 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
26770 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
26780 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
26790 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
267a0 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
267b0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
267c0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
267d0 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
267e0 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
267f0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
26800 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
26810 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
26820 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
26830 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
26840 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
26850 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
26860 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
26870 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
26880 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
26890 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
268a0 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
268b0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
268c0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
268d0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
268e0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
268f0 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
26900 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
26910 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
26920 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
26930 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26940 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
26950 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
26960 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
26970 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
26980 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
26990 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
269a0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
269b0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
269c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
269d0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
269e0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
269f0 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
26a00 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
26a10 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26a20 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
26a30 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
26a40 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
26a50 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
26a60 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
26a70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
26a80 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
26a90 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
26aa0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
26ab0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
26ac0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26ad0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26ae0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26af0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26b00 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
26b10 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
26b20 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
26b30 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26b40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
26b50 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
26b60 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
26b70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26b80 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
26b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26ba0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
26bb0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26bc0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26bd0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26be0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26bf0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26c00 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26c10 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26c20 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26c30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
26c40 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
26c50 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
26c60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26c70 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
26c80 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26c90 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26ca0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26cb0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26cc0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26cd0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26ce0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26cf0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
26d00 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
26d10 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a  t isNot;      /*
26d20 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
26d30 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
26d40 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
26d50 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45  ;     /* IS TRUE
26d60 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
26d70 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
26d80 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26d90 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20   );.      isNot 
26da0 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
26db0 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73  _ISNOT;.      is
26dc0 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
26dd0 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
26de0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
26df0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54     testcase( isT
26e00 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26e10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26e20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74  !isTrue && isNot
26e30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
26e40 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a  True ^ isNot ){.
26e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26e60 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26e70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26e80 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
26eb0 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
26ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26ed0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26ee0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26ef0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26f00 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26f20 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
26f30 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
26f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26f50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26f60 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26f70 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26f80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26f90 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
26fa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26fb0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
26fc0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
26fd0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
26fe0 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
26ff0 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
27000 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
27010 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
27020 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
27030 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
27040 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
27050 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
27060 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
27070 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
27080 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
27090 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
270a0 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
270b0 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
270c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
270d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
270e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
270f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27100 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27110 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
27120 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
27130 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27140 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
27150 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
27160 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
27170 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
27180 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
27190 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
271b0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
271c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
271d0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
271e0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
271f0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
27200 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27210 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
27220 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
27230 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27240 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
27250 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
27260 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
27270 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
27280 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27290 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
272a0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
272b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
272c0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
272d0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
272e0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
272f0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
27300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27310 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
27320 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
27330 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27340 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27350 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
27360 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
27370 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27380 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27390 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
273a0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
273b0 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
273c0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
273d0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
273e0 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
273f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27400 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
27410 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
27420 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
27430 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27440 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27450 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
27460 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
27470 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27480 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
27490 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
274a0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
274b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
274c0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
274d0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
274e0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
274f0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
27500 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
27510 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
27520 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
27530 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
27540 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
27550 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
27560 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
27570 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
27580 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27590 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
275a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
275b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
275c0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
275d0 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
275e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
275f0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
27600 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27610 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
27620 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
27630 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27640 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
27650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27660 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
27670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27680 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27690 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
276a0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
276b0 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
276c0 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75  e3ExprIfTrue, ju
276d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
276e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
276f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27700 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
27710 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
27720 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
27730 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
27740 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
27750 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
27760 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
27770 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
27780 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
27790 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
277a0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
277b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
277c0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
277d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
277e0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
277f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27800 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
27810 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
27820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
27830 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
27840 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
27850 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
27860 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
27870 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
27880 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
27890 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
278a0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
278b0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
278c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
278d0 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
278e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
278f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
27900 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27910 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
27920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27930 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27940 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
27950 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
27960 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
27970 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
27980 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27990 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
279a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
279b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
279c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
279d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
279e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
279f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
27a00 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
27a10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27a20 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
27a30 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
27a40 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
27a50 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
27a60 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
27a70 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
27a80 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
27a90 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
27aa0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
27ab0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
27ac0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
27ad0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
27ae0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
27af0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
27b00 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
27b10 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
27b20 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
27b30 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
27b40 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
27b50 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
27b60 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
27b70 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
27b80 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
27b90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
27ba0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
27bb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
27bc0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
27bd0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
27be0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27bf0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27c00 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
27c10 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
27c20 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
27c30 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
27c40 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
27c50 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
27c60 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
27c70 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
27c80 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
27c90 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
27ca0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27cb0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
27cc0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
27cd0 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
27ce0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
27cf0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
27d00 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
27d10 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
27d20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
27d30 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
27d40 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
27d50 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
27d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
27d70 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
27d80 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
27d90 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
27da0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
27db0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
27dc0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
27dd0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
27de0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27e00 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
27e10 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
27e20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
27e30 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
27e40 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
27e50 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
27e60 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
27e70 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27e90 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
27ea0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
27eb0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
27ec0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
27ed0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
27ee0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
27ef0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
27f00 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
27f10 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
27f20 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
27f30 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
27f40 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
27f50 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
27f60 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
27f70 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
27f80 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
27f90 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
27fa0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
27fb0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
27fc0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
27fd0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
27fe0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
27ff0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
28000 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
28010 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28020 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
28030 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
28040 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28050 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
28060 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
28070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28080 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
28090 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
280a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
280b0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
280c0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
280d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
280e0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
280f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28100 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
28110 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
28120 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28130 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
28140 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
28150 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28160 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
28170 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
28180 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
28190 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
281a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
281b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
281c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
281d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
281e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
281f0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28210 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
28220 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
28230 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28240 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
28250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28260 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
28270 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
28280 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
28290 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
282a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
282b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
282c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
282d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
282e0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
282f0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
28300 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
28310 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28320 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28330 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28340 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28350 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28360 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
28370 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28380 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28390 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
283a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
283b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
283c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
283d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
283e0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
283f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28410 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
28420 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
28430 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54  t;   /* IS NOT T
28440 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
28450 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
28460 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20   isTrue;  /* IS 
28470 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
28480 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
28490 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
284a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
284b0 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
284c0 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
284d0 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
284e0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
284f0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
28500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28510 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
28520 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28530 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
28540 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
28550 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
28560 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28570 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f  S TRUE and IS NO
28580 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
28590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
285a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
285b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
285c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
285e0 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
285f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20  JUMPIFNULL);..  
28600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28610 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61     /* IS FALSE a
28620 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  nd IS NOT TRUE *
28630 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
28640 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28650 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28660 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
28690 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
286a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
286b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
286c0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
286d0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
286e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
286f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28700 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28710 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
28720 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
28730 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
28740 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
28750 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
28760 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
28770 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
28780 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
28790 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
287a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
287b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
287c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
287d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
287e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
287f0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
28800 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
28810 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
28820 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
28830 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
28840 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28850 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
28860 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28870 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28880 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
28890 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
288a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
288b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
288c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
288d0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
288e0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
288f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28900 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28910 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
28920 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
28930 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28950 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
28960 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
28970 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28980 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
28990 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
289a0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
289b0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
289c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289d0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
289e0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
289f0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
28a00 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
28a10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
28a20 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
28a30 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
28a40 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
28a50 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
28a60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28a70 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
28a80 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
28a90 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
28aa0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
28ab0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28ac0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28ad0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
28ae0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28af0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28b00 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
28b10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
28b20 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28b30 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
28b40 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
28b50 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
28b60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28b70 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
28b80 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
28b90 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28ba0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28bb0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28bc0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
28bd0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28bf0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
28c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28c10 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
28c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28c30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
28c40 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
28c50 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
28c60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28c70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28c80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28c90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28cb0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28cc0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
28cd0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
28ce0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
28cf0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
28d00 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
28d10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28d20 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
28d30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28d40 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
28d50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28d60 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28d80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
28d90 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28da0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28db0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28dc0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28dd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28de0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28df0 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
28e00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
28e10 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
28e20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28e30 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
28e40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
28e50 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
28e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28e70 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28e80 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28e90 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28eb0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
28ec0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28ed0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
28ee0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28ef0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
28f00 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
28f10 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28f20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28f30 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
28f40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
28f50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
28f70 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
28f80 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20  ult_expr: .     
28f90 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
28fa0 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
28fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28fc0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
28fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28fe0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
28ff0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
29000 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
29010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29020 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
29030 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
29040 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
29050 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
29060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29070 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
29080 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
29090 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
290a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
290b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
290c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
290d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
290e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
290f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
29100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
29110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
29120 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
29130 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
29140 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29150 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
29160 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
29170 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
29180 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63  xprIfFalse() exc
29190 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20  ept that a copy 
291a0 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72  is made of pExpr
291b0 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20   before.** code 
291c0 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20  generation, and 
291d0 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c  that copy is del
291e0 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20  eted after code 
291f0 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73  generation. This
29200 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74  .** ensures that
29210 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45   the original pE
29220 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64  xpr is unchanged
29230 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29240 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
29250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29260 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
29270 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e  dest,int jumpIfN
29280 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ull){.  sqlite3 
29290 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
292a0 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20  ;.  Expr *pCopy 
292b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
292c0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
292d0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
292e0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
292f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29300 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70  lse(pParse, pCop
29310 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  y, dest, jumpIfN
29320 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
29330 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
29340 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a  , pCopy);.}../*.
29350 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56  ** Expression pV
29360 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ar is guaranteed
29370 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61   to be an SQL va
29380 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61  riable. pExpr ma
29390 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65  y be any.** type
293a0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   of expression..
293b0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
293c0 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76  s a simple SQL v
293d0 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65  alue - an intege
293e0 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c  r, real, string,
293f0 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c   blob.** or NULL
29400 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68   value - then th
29410 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79  e VDBE currently
29420 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20   being prepared 
29430 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
29440 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65   to re-prepare e
29450 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76  ach time a new v
29460 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f  alue is bound to
29470 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a   variable pVar..
29480 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  **.** Additional
29490 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  ly, if pExpr is 
294a0 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
294b0 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ue and the value
294c0 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
294d0 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  as that currentl
294e0 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  y bound to varia
294f0 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65  ble pVar, non-ze
29500 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
29510 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
29520 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
29530 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20  not the same or 
29540 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  if pExpr is not 
29550 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20  a simple.** SQL 
29560 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72  value, zero is r
29570 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29580 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61  ic int exprCompa
29590 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65  reVariable(Parse
295a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
295b0 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70  pVar, Expr *pExp
295c0 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  r){.  int res = 
295d0 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20  0;.  int iVar;. 
295e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
295f0 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a  pL, *pR = 0;.  .
29600 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29610 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  omExpr(pParse->d
29620 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45  b, pExpr, SQLITE
29630 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46  _UTF8, SQLITE_AF
29640 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20  F_BLOB, &pR);.  
29650 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56  if( pR ){.    iV
29660 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75  ar = pVar->iColu
29670 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
29680 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
29690 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
296a0 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c  r);.    pL = sql
296b0 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
296c0 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
296d0 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
296e0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29  SQLITE_AFF_BLOB)
296f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a  ;.    if( pL ){.
29700 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29710 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29  3_value_type(pL)
29720 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
29730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29740 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b  _value_text(pL);
29750 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
29760 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54  e encoding is UT
29770 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  F-8 */.      }. 
29780 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73       res =  0==s
29790 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
297a0 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20  (pL, pR, 0);.   
297b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
297c0 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20  lueFree(pR);.   
297d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
297e0 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  e(pL);.  }..  re
297f0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
29800 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
29810 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
29820 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
29830 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
29840 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29850 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
29860 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
29870 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
29880 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
29890 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
298a0 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
298b0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
298c0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
298d0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
298e0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
298f0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
29900 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
29910 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29920 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29930 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29940 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
29950 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
29960 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
29970 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
29980 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
29990 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
299a0 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
299b0 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
299c0 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
299d0 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
299e0 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
299f0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
29a00 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
29a10 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
29a20 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
29a30 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
29a40 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
29a50 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
29a60 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
29a70 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
29a80 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
29a90 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
29aa0 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
29ab0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29ac0 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
29ad0 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
29ae0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
29af0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
29b00 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
29b10 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
29b20 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
29b30 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
29b40 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
29b50 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
29b60 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
29b70 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
29b80 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
29b90 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
29ba0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
29bb0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
29bc0 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
29bd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
29be0 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
29bf0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
29c00 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
29c10 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
29c20 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
29c30 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
29c40 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
29c50 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
29c60 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
29c70 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
29c80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  n..**.** If pPar
29c90 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  se is not NULL t
29ca0 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  hen TK_VARIABLE 
29cb0 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68  terms in pA with
29cc0 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20   bindings in.** 
29cd0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
29ce0 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  re can be matche
29cf0 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61  d against litera
29d00 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a  ls in pB.  The .
29d10 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ** pParse->pVdbe
29d20 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73  ->expmask bitmas
29d30 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72  k is updated for
29d40 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72   each variable r
29d50 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66  eferenced..** If
29d60 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20   pParse is NULL 
29d70 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65  (the normal case
29d80 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41  ) then any TK_VA
29d90 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a  RIABLE term in .
29da0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72  ** Argument pPar
29db0 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  se should normal
29dc0 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ly be NULL. If i
29dd0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  t is not NULL an
29de0 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61  d pA or.** pB ca
29df0 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61  uses a return va
29e00 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74  lue of 2..*/.int
29e10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29e20 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  are(Parse *pPars
29e30 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70  e, Expr *pA, Exp
29e40 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
29e50 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
29e60 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
29e70 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
29e80 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
29e90 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
29ea0 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41  if( pParse && pA
29eb0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
29ec0 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65  E && exprCompare
29ed0 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c  Variable(pParse,
29ee0 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20   pA, pB) ){.    
29ef0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29f00 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
29f10 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
29f20 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
29f30 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29f40 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
29f50 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
29f60 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
29f70 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
29f80 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
29f90 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
29fa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
29fb0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29fc0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
29fd0 70 42 2d 3e 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70  pB->op || pA->op
29fe0 3d 3d 54 4b 5f 52 41 49 53 45 20 29 7b 0a 20 20  ==TK_RAISE ){.  
29ff0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
2a000 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2a010 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a020 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a030 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
2a040 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
2a060 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2a070 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
2a080 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2a090 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
2a0a0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
2a0b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2a0c0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2a0d0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
2a0e0 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
2a0f0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
2a100 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2a110 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2a120 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2a130 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a140 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a150 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a160 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a170 20 32 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   2;.#ifndef SQLI
2a180 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2a190 4e 43 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  NC.      /* Just
2a1a0 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68  ification for th
2a1b0 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20  e assert():.    
2a1c0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
2a1d0 74 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70  tions have p->op
2a1e0 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75  ==TK_FUNCTION bu
2a1f0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2a200 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 68  tions.      ** h
2a210 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  ave p->op==TK_AG
2a220 47 5f 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20  G_FUNCTION.  So 
2a230 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  any comparison b
2a240 65 74 77 65 65 6e 20 61 6e 20 61 67 67 72 65 67  etween an aggreg
2a250 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  ate.      ** fun
2a260 63 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64  ction and a wind
2a270 6f 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ow function shou
2a280 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 62  ld have failed b
2a290 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a 20  efore reaching. 
2a2a0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2a2b0 6e 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73 20  nt.  And, it is 
2a2c0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2a2d0 68 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66 75  have a window fu
2a2e0 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  nction and.     
2a2f0 20 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e   ** a scalar fun
2a300 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2a310 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d  ame name and num
2a320 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2a330 2e 20 20 53 6f 0a 20 20 20 20 20 20 2a 2a 20 69  .  So.      ** i
2a340 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2a350 70 6f 69 6e 74 2c 20 65 69 74 68 65 72 20 41 20  point, either A 
2a360 61 6e 64 20 42 20 62 6f 74 68 20 77 69 6e 64 6f  and B both windo
2a370 77 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20  w functions or. 
2a380 20 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72 20       ** neither 
2a390 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  are a window fun
2a3a0 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20  ctions. */.     
2a3b0 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
2a3c0 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50 5f 57  Property(pA,EP_W
2a3d0 69 6e 46 75 6e 63 29 3d 3d 45 78 70 72 48 61 73  inFunc)==ExprHas
2a3e0 50 72 6f 70 65 72 74 79 28 70 42 2c 45 50 5f 57  Property(pB,EP_W
2a3f0 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20  inFunc) );.     
2a400 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2a410 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
2a420 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nc) ){.        i
2a430 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  f( sqlite3Window
2a440 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70  Compare(pParse,p
2a450 41 2d 3e 79 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e  A->y.pWin,pB->y.
2a460 70 57 69 6e 29 21 3d 30 20 29 20 72 65 74 75 72  pWin)!=0 ) retur
2a470 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  n 2;.      }.#en
2a480 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
2a490 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  ( pA->op==TK_NUL
2a4a0 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L ){.      retur
2a4b0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
2a4c0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a4d0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2a4e0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2a4f0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a500 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a510 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a520 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
2a530 53 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  S(pB->u.zToken!=
2a540 30 29 20 26 26 20 73 74 72 63 6d 70 28 70 41 2d  0) && strcmp(pA-
2a550 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a560 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
2a570 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
2a580 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2a590 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
2a5a0 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
2a5b0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a5c0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
2a5d0 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
2a5e0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2a5f0 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ly)==0 ){.    if
2a600 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a610 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
2a620 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a630 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2a640 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
2a650 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
2a660 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a670 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a680 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a690 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a6a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a6b0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a6c0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a6d0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a6e0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a6f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a700 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a710 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a720 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a730 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70  urn 2;.    if( p
2a740 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a750 0a 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21  .     && pA->op!
2a760 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20  =TK_TRUEFALSE.  
2a770 20 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46     && (combinedF
2a780 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a790 64 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  d)==0.    ){.   
2a7a0 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a7b0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a7c0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a7d0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2a7e0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2a7f0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2a800 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2a810 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2a820 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2a830 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a840 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2a850 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2a860 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2a870 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2a880 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2a890 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2a8a0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2a8b0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2a8c0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2a8d0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2a8e0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2a8f0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2a900 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2a910 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2a920 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2a930 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2a940 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2a950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2a960 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2a970 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2a980 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2a990 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2a9a0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2a9b0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2a9c0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2a9d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2a9e0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2a9f0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2aa00 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2aa10 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2aa20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2aa30 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2aa40 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2aa50 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2aa60 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2aa70 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2aa80 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2aa90 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2aaa0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2aab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2aac0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2aad0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2aae0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2aaf0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2ab00 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2ab10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2ab20 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2ab30 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2ab40 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2ab50 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2ab60 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2ab70 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2ab80 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2ab90 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2aba0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2abb0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2abc0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2abd0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2abe0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2abf0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2ac00 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2ac10 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ac20 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2ac30 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2ac40 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2ac50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ac60 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2ac70 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2ac80 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2ac90 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2aca0 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2acb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2acc0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2acd0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2ace0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2acf0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2ad00 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ad20 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ad30 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2ad40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ad50 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2ad60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2ad70 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2ad80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2ad90 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2ada0 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2adb0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2adc0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2add0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2ade0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2adf0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2ae00 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2ae10 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2ae20 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2ae30 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2ae40 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2ae50 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2ae60 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2ae70 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2ae80 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2ae90 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2aea0 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2aeb0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2aec0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2aed0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2aee0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2aef0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2af00 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2af10 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2af20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2af30 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2af40 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2af50 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2af60 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2af70 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2af80 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2af90 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2afa0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2afb0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2afc0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2afd0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2afe0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2aff0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2b000 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2b010 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2b020 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2b030 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2b040 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2b050 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2b060 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2b070 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2b080 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2b090 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2b0a0 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2b0b0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2b0c0 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2b0d0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2b0e0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2b0f0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2b100 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2b110 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2b120 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2b130 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2b140 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2b150 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2b160 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2b170 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2b180 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2b190 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2b1a0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2b1b0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2b1c0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2b1d0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2b1e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2b1f0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2b200 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2b210 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2b220 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2b230 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2b240 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b250 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2b260 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b270 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2b280 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2b290 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2b2a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2b2b0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2b2c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b2d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2b2e0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2b2f0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2b300 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2b310 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2b320 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2b330 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2b340 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b350 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b360 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2b370 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b380 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b390 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2b3a0 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2b3b0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2b3c0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2b3d0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2b3e0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b3f0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2b400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b410 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2b420 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b430 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b440 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2b450 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2b460 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b470 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b480 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2b490 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2b4a0 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2b4b0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b4c0 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2b4d0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2b4e0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2b4f0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2b500 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2b510 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2b520 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2b530 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2b540 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2b550 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2b560 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2b570 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2b580 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2b590 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2b5a0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2b5b0 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2b5c0 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2b5d0 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2b5e0 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2b5f0 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2b600 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2b610 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2b620 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2b630 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2b640 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2b650 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2b660 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2b670 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b680 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2b690 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2b6a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2b6b0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2b6c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b6d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2b6e0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2b6f0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2b700 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b710 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b720 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2b730 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2b740 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2b750 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
2b760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
2b770 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
2b780 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
2b790 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
2b7a0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  N:.    case TK_F
2b7b0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74  UNCTION:.      t
2b7c0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b7d0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
2b7e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b7f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
2b800 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b810 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b820 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
2b830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b840 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  pr->op==TK_NOTNU
2b850 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
2b860 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b870 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
2b880 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b890 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
2b8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b8b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45  xpr->op==TK_CASE
2b8c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b8d0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b8e0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IN );.      te
2b8f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b900 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2b910 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2b920 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61  RC_Prune;.    ca
2b930 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2b940 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
2b950 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e  >u.iCur==pExpr->
2b960 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
2b970 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2b980 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2b990 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2b9b0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2b9c0 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  .    /* Virtual 
2b9d0 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77  tables are allow
2b9e0 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72  ed to use constr
2b9f0 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c  aints like x=NUL
2ba00 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20  L.  So.    ** a 
2ba10 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
2ba20 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72   x=y does not pr
2ba30 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f  ove that y is no
2ba40 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20  t null if x.    
2ba50 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ** is the column
2ba60 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
2ba70 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ble */.    case 
2ba80 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
2ba90 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
2baa0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
2bab0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
2bac0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
2bad0 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73  TK_GE:.      tes
2bae0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2baf0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
2bb00 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bb10 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
2bb20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bb30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2bb40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bb50 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bb60 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
2bb70 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bb80 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
2bb90 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bba0 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
2bbb0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
2bbc0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
2bbd0 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2bbe0 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  al(pExpr->pLeft-
2bbf0 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2bc00 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67   || (pExpr->pRig
2bc10 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
2bc20 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  N && IsVirtual(p
2bc30 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79 2e  Expr->pRight->y.
2bc40 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a  pTab)).      ){.
2bc50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2bc60 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2bc70 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2bc80 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2bc90 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a  ontinue;.  }.}..
2bca0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2bcb0 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
2bcc0 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e  expression p can
2bcd0 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66   only be true if
2bce0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
2bcf0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2bd00 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c   iTab is non-nul
2bd10 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
2bd20 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a  ds, return true.
2bd30 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ** if expression
2bd40 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62   p will always b
2bd50 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20  e NULL or false 
2bd60 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  if every column 
2bd70 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2bd80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  LL..**.** False 
2bd90 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61 63  negatives are ac
2bda0 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ceptable.  In ot
2bdb0 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69 73  her words, it is
2bdc0 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a   ok to return.**
2bdd0 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65 78   zero even if ex
2bde0 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20  pression p will 
2bdf0 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f 66  never be true of
2be00 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
2be10 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c   iTab.** is NULL
2be20 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
2be30 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61 20  ive is merely a 
2be40 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74  missed optimizat
2be50 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  ion opportunity.
2be60 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73  .**.** False pos
2be70 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20 61  itives are not a
2be80 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72 2e  llowed, however.
2be90 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
2bea0 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  ve may result.**
2beb0 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
2bec0 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   answer..**.** T
2bed0 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20 61  erms of p that a
2bee0 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45  re marked with E
2bef0 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20  P_FromJoin (and 
2bf00 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65 20  hence that come 
2bf10 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f  from.** the ON o
2bf20 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2bf30 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61  of LEFT JOINS) a
2bf40 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
2bf50 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a   the analysis..*
2bf60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bf70 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
2bf80 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f 49  ck if a LEFT JOI
2bf90 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  N can be convert
2bfa0 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72  ed into.** an or
2bfb0 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68  dinary JOIN.  Th
2bfc0 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e p argument is 
2bfd0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2bfe0 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45 0a  .  If the WHERE.
2bff0 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69 72  ** clause requir
2c000 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c  es that some col
2c010 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74  umn of the right
2c020 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c 45   table of the LE
2c030 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f  FT JOIN.** be no
2c040 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  n-NULL, then the
2c050 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2c060 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72 74  e safely convert
2c070 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72  ed into an.** or
2c080 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a  dinary join..*/.
2c090 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
2c0a0 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
2c0b0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2c0c0 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ab){.  Walker w;
2c0d0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2c0e0 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e  ck = impliesNotN
2c0f0 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c  ullRow;.  w.xSel
2c100 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
2c110 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2c120 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65  back2 = 0;.  w.e
2c130 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  Code = 0;.  w.u.
2c140 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 73  iCur = iTab;.  s
2c150 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2c160 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
2c170 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
2c180 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c190 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c1a0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2c1b0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2c1c0 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ker.** to determ
2c1d0 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
2c1e0 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c  sion can be eval
2c1f0 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e  uated by referen
2c200 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64  ce to the.** ind
2c210 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74  ex only, without
2c220 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20   having to do a 
2c230 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
2c240 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2c250 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68  table entry.  Th
2c260 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20  e IdxCover.pIdx 
2c270 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64  field is the ind
2c280 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43  ex.  IdxCover.iC
2c290 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72  ur.** is the cur
2c2a0 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
2c2b0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
2c2c0 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20  Cover {.  Index 
2c2d0 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  *pIdx;     /* Th
2c2e0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
2c2f0 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  sted for coverag
2c300 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
2c310 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2c320 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
2c330 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
2c340 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65  ding to the inde
2c350 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  x */.};../*.** C
2c360 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2c370 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e  here are referen
2c380 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2c390 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c  n table .** pWal
2c3a0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c3b0 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61  ->iCur can be sa
2c3c0 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68  tisfied using th
2c3d0 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b  e index.** pWalk
2c3e0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2c3f0 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  >pIdx..*/.static
2c400 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65   int exprIdxCove
2c410 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
2c420 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2c430 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2c440 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
2c450 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
2c460 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  =pWalker->u.pIdx
2c470 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26  Cover->iCur.   &
2c480 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  & sqlite3ColumnO
2c490 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e  fIndex(pWalker->
2c4a0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2c4b0 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  x, pExpr->iColum
2c4c0 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57  n)<0.  ){.    pW
2c4d0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2c4e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
2c4f0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65  _Abort;.  }.  re
2c500 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2c510 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2c520 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65  rmine if an inde
2c530 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20  x pIdx on table 
2c540 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
2c550 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a   contains will.*
2c560 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
2c570 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20   pExpr.  Return 
2c580 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65  true if the inde
2c590 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65  x does cover the
2c5a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
2c5b0 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
2c5c0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2c5d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c   references tabl
2c5e0 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61  e columns.** tha
2c5f0 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20  t are not found 
2c600 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
2c610 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65  x..**.** An inde
2c620 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78  x covering an ex
2c630 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74  pression means t
2c640 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
2c650 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61  on can be.** eva
2c660 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c  luated using onl
2c670 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  y the index and 
2c680 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
2c690 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20  o lookup the.** 
2c6a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2c6b0 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e  ble entry..*/.in
2c6c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76  t sqlite3ExprCov
2c6d0 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45  eredByIndex(.  E
2c6e0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
2c6f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2c700 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a  to be tested */.
2c710 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2c720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2c730 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2c740 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2c750 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65   table */.  Inde
2c760 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2c770 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
2c780 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
2c790 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2c7a0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2c7b0 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72   struct IdxCover
2c7c0 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28   xcov;.  memset(
2c7d0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
2c7e0 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d  );.  xcov.iCur =
2c7f0 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49   iCur;.  xcov.pI
2c800 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78  dx = pIdx;.  w.x
2c810 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2c820 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77  xprIdxCover;.  w
2c830 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26  .u.pIdxCover = &
2c840 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57  xcov;.  sqlite3W
2c850 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2c860 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e  r);.  return !w.
2c870 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  eCode;.}.../*.**
2c880 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2c890 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2c8a0 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2c8b0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2c8c0 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
2c8d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
2c8e0 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
2c8f0 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
2c900 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
2c910 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
2c920 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
2c930 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
2c940 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
2c950 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
2c960 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
2c970 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2c980 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
2c990 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
2c9a0 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
2c9b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
2c9c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c9d0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2c9e0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
2c9f0 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
2ca00 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
2ca10 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2ca20 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2ca30 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
2ca40 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
2ca50 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
2ca60 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2ca70 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
2ca80 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
2ca90 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
2caa0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2cab0 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
2cac0 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
2cad0 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
2cae0 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
2caf0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2cb00 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
2cb10 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
2cb20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2cb30 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
2cb40 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
2cb50 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
2cb60 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
2cb70 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
2cb80 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
2cb90 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2cba0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
2cbb0 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
2cbc0 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
2cbd0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
2cbe0 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
2cbf0 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
2cc00 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2cc10 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
2cc20 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
2cc30 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
2cc40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2cc50 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2cc60 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
2cc70 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
2cc80 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
2cc90 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
2cca0 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
2ccb0 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
2ccc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
2ccd0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
2cce0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2ccf0 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
2cd00 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
2cd10 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
2cd20 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
2cd30 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
2cd40 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
2cd50 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
2cd60 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2cd70 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2cd80 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
2cd90 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2cda0 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
2cdb0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
2cdc0 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
2cdd0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2cde0 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
2cdf0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2ce00 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
2ce10 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
2ce20 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
2ce30 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
2ce40 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
2ce50 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
2ce60 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
2ce70 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
2ce80 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
2ce90 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
2cea0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2ceb0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
2cec0 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
2ced0 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
2cee0 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
2cef0 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
2cf00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2cf10 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2cf20 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  ON );.  w.xExprC
2cf30 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72  allback = exprSr
2cf40 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  cCount;.  w.xSel
2cf50 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
2cf60 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
2cf70 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
2cf80 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
2cf90 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
2cfa0 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
2cfb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
2cfc0 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
2cfd0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2cfe0 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
2cff0 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
2d000 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
2d010 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2d020 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2d030 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
2d040 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2d050 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2d060 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2d070 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2d080 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2d090 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d0a0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2d0b0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
2d0c0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2d0d0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2d0e0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
2d0f0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2d100 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
2d110 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
2d120 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2d130 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
2d140 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
2d150 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
2d160 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2d170 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
2d180 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2d190 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2d1a0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
2d1b0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2d1c0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2d1d0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2d1e0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2d1f0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2d200 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d210 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2d220 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2d230 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2d240 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2d250 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
2d260 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2d270 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
2d280 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
2d290 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2d2a0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
2d2b0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
2d2c0 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
2d2d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2d2e0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
2d2f0 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
2d300 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
2d310 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
2d320 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
2d330 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
2d340 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d350 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
2d360 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2d370 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
2d380 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2d390 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
2d3a0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2d3b0 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
2d3c0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2d3d0 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
2d3e0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2d3f0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
2d400 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
2d410 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
2d420 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
2d430 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
2d440 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
2d450 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
2d460 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a  ->uNC.pAggInfo;.
2d470 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2d480 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67  ncFlags & NC_UAg
2d490 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63  gInfo );.  switc
2d4a0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2d4b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2d4c0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
2d4d0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
2d4e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2d4f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2d500 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
2d510 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2d520 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2d530 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
2d540 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
2d550 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
2d560 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
2d570 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
2d580 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
2d590 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2d5a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
2d5b0 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
2d5c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
2d5d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2d5e0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
2d5f0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
2d600 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
2d610 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2d620 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d630 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2d640 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
2d650 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2d660 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d670 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2d680 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2d690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d6a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2d6b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
2d6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2d6d0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2d6e0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
2d6f0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
2d700 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
2d710 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
2d720 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
2d730 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2d740 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
2d750 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
2d760 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
2d770 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
2d780 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
2d790 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2d7a0 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
2d7b0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2d7c0 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
2d7d0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
2d7e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d7f0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
2d800 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
2d810 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
2d820 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
2d830 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
2d840 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
2d850 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
2d860 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
2d870 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2d880 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2d890 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d8a0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2d8b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2d8c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d8f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2d900 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
2d910 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
2d920 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
2d930 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
2d940 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2d950 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
2d960 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2d970 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
2d980 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d9a0 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
2d9b0 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
2d9c0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
2d9d0 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
2d9e0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
2d9f0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2da00 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
2da10 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2da20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
2da30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2da40 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2da50 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2da60 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2da70 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
2da80 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2da90 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
2daa0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
2dab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dac0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
2dad0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
2dae0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
2daf0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2db10 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2db20 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
2db30 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
2db40 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
2db50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2db60 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2db70 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
2db80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2db90 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2dba0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2dbc0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
2dbd0 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
2dbe0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2dbf0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2dc00 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
2dc10 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2dc20 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2dc40 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2dc50 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
2dc60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2dc70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2dc80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dcb0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2dcc0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
2dcd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dce0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2dcf0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
2dd00 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
2dd10 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
2dd20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2dd30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
2dd40 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
2dd50 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
2dd60 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
2dd70 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
2dd80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
2dd90 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
2dda0 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
2ddb0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
2ddc0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
2ddd0 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
2dde0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
2ddf0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
2de00 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
2de10 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
2de20 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2de30 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
2de40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2de50 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2de60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2de70 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2de80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2de90 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2dea0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
2deb0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
2dec0 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
2ded0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2dee0 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
2def0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2df00 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
2df10 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
2df20 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2df30 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
2df40 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
2df50 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
2df60 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2df70 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2df80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
2df90 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
2dfa0 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
2dfb0 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
2dfc0 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
2dfd0 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
2dfe0 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
2dff0 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
2e000 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2e010 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
2e020 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
2e030 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
2e040 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
2e050 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
2e060 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
2e070 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2e080 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
2e090 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2e0a0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
2e0b0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
2e0c0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
2e0d0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2e0e0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
2e0f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2e100 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2e110 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d  ompare(0, pItem-
2e120 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
2e130 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
2e140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e160 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
2e170 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
2e180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e190 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
2e1a0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
2e1b0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
2e1c0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
2e1d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e1e0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
2e1f0 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
2e200 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
2e210 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
2e220 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
2e230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2e240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e250 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2e260 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2e270 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2e280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2e290 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
2e2a0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
2e2b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2e2c0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2e2d0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e2e0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2e2f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2e300 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e310 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2e320 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
2e330 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2e340 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
2e350 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
2e360 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
2e390 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
2e3a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
2e3b0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
2e3c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
2e3d0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
2e3e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2e3f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
2e400 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2e410 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2e420 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
2e430 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2e440 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e450 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2e460 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
2e470 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2e480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2e4a0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
2e4b0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
2e4c0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
2e4d0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
2e4e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e4f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2e500 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2e510 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2e520 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2e530 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2e540 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2e550 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2e560 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2e570 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
2e580 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2e590 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2e5a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2e5b0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2e5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
2e5d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2e5e0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2e5f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2e600 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
2e610 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2e620 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2e630 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
2e640 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2e650 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2e660 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
2e670 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
2e680 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72  lkerDepth++;.  r
2e690 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2e6a0 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ue;.}.static voi
2e6b0 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  d analyzeAggrega
2e6c0 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57  tesInSelectEnd(W
2e6d0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2e6e0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2e6f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2e700 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
2e710 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2e720 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  Depth--;.}../*.*
2e730 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
2e740 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
2e750 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
2e760 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2e770 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
2e780 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
2e790 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
2e7a0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
2e7b0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
2e7c0 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
2e7d0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
2e7e0 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
2e7f0 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2e800 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
2e810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2e820 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2e830 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
2e840 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
2e850 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
2e860 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
2e870 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
2e880 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e890 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2e8a0 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
2e8b0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
2e8c0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
2e8d0 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2e8e0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2e8f0 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
2e900 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
2e910 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2e920 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53  InSelect;.  w.xS
2e930 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2e940 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2e950 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20  esInSelectEnd;. 
2e960 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
2e970 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20   0;.  w.u.pNC = 
2e980 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pNC;.  w.pParse 
2e990 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
2e9a0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
2e9b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
2e9c0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
2e9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
2e9e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2e9f0 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
2ea00 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
2ea10 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
2ea20 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
2ea30 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2ea40 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
2ea50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
2ea60 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
2ea70 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
2ea80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2ea90 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2eaa0 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
2eab0 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
2eac0 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
2ead0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2eae0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
2eaf0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2eb00 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
2eb10 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
2eb20 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
2eb30 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2eb40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2eb50 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
2eb60 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
2eb70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2eb80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2eb90 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
2eba0 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
2ebb0 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
2ebc0 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
2ebd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2ebe0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2ebf0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
2ec00 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
2ec10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
2ec20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2ec30 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
2ec40 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
2ec50 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
2ec60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2ec70 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
2ec80 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
2ec90 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
2eca0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
2ecb0 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  urpose..*/.void 
2ecc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ecd0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2ece0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
2ecf0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
2ed00 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
2ed10 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
2ed20 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
2ed30 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
2ed40 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
2ed50 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
2ed60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2ed70 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
2ed80 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
2ed90 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
2eda0 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74  egisters..*/.int
2edb0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2edc0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2edd0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
2ede0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
2edf0 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72   nReg==1 ) retur
2ee00 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  n sqlite3GetTemp
2ee10 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
2ee20 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
2ee30 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
2ee40 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
2ee50 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
2ee60 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2ee70 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
2ee80 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2ee90 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
2eea0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
2eeb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2eec0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2eed0 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
2eee0 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
2eef0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ef00 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2ef10 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
2ef20 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
2ef30 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
2ef40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ef50 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2ef60 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
2ef70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 67  ;.  }.  if( nReg
2ef80 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
2ef90 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
2efa0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
2efb0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2efc0 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
2efd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
2efe0 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
2eff0 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
2f000 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
2f010 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
2f020 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
2f030 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
2f040 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
2f050 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
2f060 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2f070 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.
2f080 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20  ./*.** Validate 
2f090 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72  that no temporar
2f0a0 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73  y register falls
2f0b0 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
2f0c0 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e  e of.** iFirst..
2f0d0 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
2f0e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2f0f0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f  is only call fro
2f100 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  m within assert(
2f110 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
2f120 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2f130 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69  E_DEBUG.int sqli
2f140 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
2f150 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f160 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74   int iFirst, int
2f170 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69   iLast){.  int i
2f180 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2f190 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26  nRangeReg>0.   &
2f1a0 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2f1b0 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg+pParse->nRan
2f1c0 67 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20  geReg > iFirst. 
2f1d0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2f1e0 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a  ngeReg <= iLast.
2f1f0 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
2f200 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
2f210 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
2f220 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
2f230 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
2f240 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
2f250 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
2f260 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
2f270 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2f280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f290 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2f2a0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
2f2b0 20 2a 2f 0a                                       */.