/ Hex Artifact Content
Login

Artifact 84b83f3f5cbed871be9388693ca4f5a95ff3104f27cd2e5440ae9f431993f899:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
3db0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
3dc0: 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
3dd0: 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20  Expr is of type 
3de0: 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72  TK_SELECT, gener
3df0: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
3e00: 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75  uate.** it. Retu
3e10: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
3e20: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3e30: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f  ult is stored (o
3e40: 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  r, if the .** su
3e50: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
3e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
3e70: 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74  olumn, the first
3e80: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20   in an array.** 
3e90: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
3ea0: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3eb0: 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a   is stored)..**.
3ec0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e  ** If pExpr is n
3ed0: 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  ot a TK_SELECT e
3ee0: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
3ef0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
3f00: 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  nt exprCodeSubse
3f10: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
3f20: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
3f30: 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b  {.  int reg = 0;
3f40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f50: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
3f60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
3f70: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
3f80: 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  reg = sqlite3Cod
3f90: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
3fa0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23  e, pExpr);.  }.#
3fb0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
3fc0: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  eg;.}../*.** Arg
3fd0: 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f  ument pVector po
3fe0: 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72  ints to a vector
3ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69   expression - ei
4000: 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52  ther a TK_VECTOR
4010: 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54  .** or TK_SELECT
4020: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f   that returns mo
4030: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
4040: 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  mn. This functio
4050: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
4060: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
4070: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74   of a register t
4080: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
4090: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65   value of.** ele
40a0: 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74  ment iField of t
40b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  he vector..**.**
40c0: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
40d0: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
40e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65  ssion, then code
40f0: 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76   for it must hav
4100: 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  e .** already be
4110: 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  en generated usi
4120: 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53  ng the exprCodeS
4130: 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69  ubselect() routi
4140: 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ne. In this.** c
4150: 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65  ase parameter re
4160: 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62  gSelect should b
4170: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
4180: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
4190: 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ters.** containi
41a0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
41b0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
41c0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  . .**.** If pVec
41d0: 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  tor is of type T
41e0: 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63  K_VECTOR, then c
41f0: 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  ode for the requ
4200: 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69  ested field.** i
4210: 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20  s generated. In 
4220: 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67  this case (*pReg
4230: 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74  Free) may be set
4240: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
4250: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
4260: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
4270: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4280: 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ler before retur
4290: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
42a0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75  re returning, ou
42b0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28  tput parameter (
42c0: 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20  *ppExpr) is set 
42d0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
42e0: 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63  ** Expr object c
42f0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
4300: 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66  element iElem of
4310: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a   the vector..*/.
4320: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56  static int exprV
4330: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20  ectorRegister(. 
4340: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
4370: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
4380: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
4390: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
43a0: 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d   to extract elem
43b0: 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ent from */.  in
43c0: 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t iField,       
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43e0: 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63   Field to extrac
43f0: 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a  t from pVector *
4400: 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63  /.  int regSelec
4410: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4420: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
4430: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4440: 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  rs */.  Expr **p
4450: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
4460: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4470: 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65  Expression eleme
4480: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nt */.  int *pRe
4490: 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  gFree           
44a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
44b0: 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
44c0: 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38   free */.){.  u8
44d0: 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f   op = pVector->o
44e0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  p;.  assert( op=
44f0: 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70  =TK_VECTOR || op
4500: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c  ==TK_REGISTER ||
4510: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
4520: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
4530: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a  EGISTER ){.    *
4540: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
4550: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
4560: 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65  pr(pVector, iFie
4570: 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
4580: 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b  pVector->iTable+
4590: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66  iField;.  }.  if
45a0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
45b0: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
45c0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
45d0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
45e0: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
45f0: 20 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c     return regSel
4600: 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ect+iField;.  }.
4610: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
4620: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
4630: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
4640: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
4650: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
4660: 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65  se, *ppExpr, pRe
4670: 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gFree);.}../*.**
4680: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
4690: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
46a0: 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65  n between two ve
46b0: 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ctor values. Com
46c0: 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  pute.** the resu
46d0: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
46e0: 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e  ison (1, 0, or N
46f0: 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74  ULL) and write t
4700: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
4710: 74 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74  to register dest
4720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
4730: 65 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20  er must satisfy 
4740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
4750: 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a  econditions:.**.
4760: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
4770: 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20  op==TK_IS:      
4780: 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35  op==TK_EQ and p5
4790: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
47a0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
47b0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  op==TK_ISNOT:   
47c0: 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35  op==TK_NE and p5
47d0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
47e0: 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a  **    otherwise:
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e  op==pExpr->op an
4810: 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69  d p5==0.*/.stati
4820: 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f  c void codeVecto
4830: 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  rCompare(.  Pars
4840: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4850: 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61    /* Code genera
4860: 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  tor context */. 
4870: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
4880: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4890: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
48a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
48b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
48c0: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69   Write results i
48d0: 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
48e0: 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  r */.  u8 op,   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  Comparison opera
4910: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  tor */.  u8 p5  
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4930: 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  * SQLITE_NULLEQ 
4940: 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20  or zero */.){.  
4950: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4960: 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20  ->pVdbe;.  Expr 
4970: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4980: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70  pLeft;.  Expr *p
4990: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
49a0: 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65  Right;.  int nLe
49b0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
49c0: 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
49d0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
49e0: 74 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20  t regLeft = 0;. 
49f0: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
4a00: 30 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70  0;.  u8 opx = op
4a10: 3b 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65  ;.  int addrDone
4a20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4a30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69  keLabel(v);..  i
4a40: 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65  f( nLeft!=sqlite
4a50: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
4a60: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
4a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4a80: 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
4a90: 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
4aa0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
4ab0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
4ac0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
4ad0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20  ->op==TK_NE .   
4ae0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4af0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
4b00: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
4b10: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b20: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45  >op==TK_LT || pE
4b30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a  xpr->op==TK_GT .
4b40: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4b50: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45  >op==TK_LE || pE
4b60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a  xpr->op==TK_GE .
4b70: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
4b80: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20  Expr->op==op || 
4b90: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
4ba0: 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a  S && op==TK_EQ).
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
4bc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4bd0: 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT && op==TK_NE
4be0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4bf0: 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  5==0 || pExpr->o
4c00: 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72  p!=op );.  asser
4c10: 74 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  t( p5==SQLITE_NU
4c20: 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  LLEQ || pExpr->o
4c30: 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c  p==op );..  p5 |
4c40: 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  = SQLITE_STOREP2
4c50: 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f  ;.  if( opx==TK_
4c60: 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54  LE ) opx = TK_LT
4c70: 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f  ;.  if( opx==TK_
4c80: 47 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54  GE ) opx = TK_GT
4c90: 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65  ;..  regLeft = e
4ca0: 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74  xprCodeSubselect
4cb0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
4cc0: 0a 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78  .  regRight = ex
4cd0: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4ce0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
4cf0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f  ..  for(i=0; 1 /
4d00: 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22  *Loop exits by "
4d10: 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a  break"*/; i++){.
4d20: 20 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31      int regFree1
4d30: 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d   = 0, regFree2 =
4d40: 20 30 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   0;.    Expr *pL
4d50: 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20  , *pR; .    int 
4d60: 72 31 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65  r1, r2;.    asse
4d70: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c  rt( i>=0 && i<nL
4d80: 65 66 74 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  eft );.    r1 = 
4d90: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4da0: 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
4db0: 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20 26 70  , i, regLeft, &p
4dc0: 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  L, &regFree1);. 
4dd0: 20 20 20 72 32 20 3d 20 65 78 70 72 56 65 63 74     r2 = exprVect
4de0: 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73  orRegister(pPars
4df0: 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20 72 65  e, pRight, i, re
4e00: 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26 72 65  gRight, &pR, &re
4e10: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63 6f 64  gFree2);.    cod
4e20: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
4e30: 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31   pL, pR, opx, r1
4e40: 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35 29 3b  , r2, dest, p5);
4e50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4e60: 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
4e70: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4e80: 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Lt);.    testc
4e90: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
4ea0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4eb0: 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
4ec0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4ed0: 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
4ee0: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
4ef0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4f00: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
4f10: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4f20: 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74 65 73  =OP_Ge);.    tes
4f30: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
4f40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4f50: 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
4f60: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4f70: 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
4f80: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4f90: 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ne);.    sqlite3
4fa0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4fb0: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
4fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
4fd0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4fe0: 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
4ff0: 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d     if( i==nLeft-
5000: 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  1 ){.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  opx==TK_EQ ){.  
5030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5040: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5050: 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  t, dest, addrDon
5060: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5070: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
5080: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
5090: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
50a0: 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20  opx==TK_NE ){.  
50b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
50c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
50d0: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
50e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50f0: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
5100: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
5110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5120: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c  assert( op==TK_L
5130: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c  T || op==TK_GT |
5140: 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  | op==TK_LE || o
5150: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
5160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5170: 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f  Op2(v, OP_ElseNo
5180: 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65  tEq, 0, addrDone
5190: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
51a0: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
51b0: 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
51c0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
51d0: 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20  p==TK_GT);.     
51e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
51f0: 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  v, op==TK_LE);. 
5200: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5210: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45  eIf(v, op==TK_GE
5220: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
5230: 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20  nLeft-2 ) opx = 
5240: 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  op;.    }.  }.  
5250: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
5260: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44  veLabel(v, addrD
5270: 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  one);.}..#if SQL
5280: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
5290: 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TH>0./*.** Check
52a0: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e   that argument n
52b0: 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74  Height is less t
52c0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
52d0: 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65  the maximum.** e
52e0: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20  xpression depth 
52f0: 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69  allowed. If it i
5300: 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20  s not, leave an 
5310: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
5320: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69  .** pParse..*/.i
5330: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nt sqlite3ExprCh
5340: 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20  eckHeight(Parse 
5350: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65  *pParse, int nHe
5360: 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ight){.  int rc 
5370: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5380: 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50  nt mxHeight = pP
5390: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
53a0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
53b0: 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28  PR_DEPTH];.  if(
53c0: 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68   nHeight>mxHeigh
53d0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
53e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
53f0: 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73   .       "Expres
5400: 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f  sion tree is too
5410: 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20   large (maximum 
5420: 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65  depth %d)", mxHe
5430: 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  ight.    );.    
5440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5450: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
5460: 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f  rc;.}../* The fo
5470: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75  llowing three fu
5480: 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f  nctions, heightO
5490: 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f  fExpr(), heightO
54a0: 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61  fExprList().** a
54b0: 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  nd heightOfSelec
54c0: 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f  t(), are used to
54d0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   determine the m
54e0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a  aximum height.**
54f0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
5500: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
5510: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
5520: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
5530: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
5540: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
5550: 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  is maximum heigh
5560: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5570: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
5580: 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  lue pointed.** t
5590: 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74  o by pnHeight, t
55a0: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
55b0: 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ter, then set *p
55c0: 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a  nHeight to that.
55d0: 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ** value..*/.sta
55e0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
55f0: 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  fExpr(Expr *p, i
5600: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5610: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
5620: 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e  ( p->nHeight>*pn
5630: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  Height ){.      
5640: 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e  *pnHeight = p->n
5650: 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  Height;.    }.  
5660: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
5670: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5680: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5690: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
56a0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
56b0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
56c0: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
56d0: 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f  ){.      heightO
56e0: 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45  fExpr(p->a[i].pE
56f0: 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  xpr, pnHeight);.
5700: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
5710: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5720: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
5730: 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48  Select, int *pnH
5740: 65 69 67 68 74 29 7b 0a 20 20 53 65 6c 65 63 74  eight){.  Select
5750: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65   *p;.  for(p=pSe
5760: 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50  lect; p; p=p->pP
5770: 72 69 6f 72 29 7b 0a 20 20 20 20 68 65 69 67 68  rior){.    heigh
5780: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
5790: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
57a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57b0: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
57c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
57d0: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
57e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57f0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5800: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
5810: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5820: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5830: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
5840: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5850: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
5860: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
5870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
5880: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5890: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
58a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
58b0: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
58c0: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
58d0: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
58e0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
58f0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
5900: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
5910: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
5920: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
5930: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
5940: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
5950: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5960: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
5970: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
5980: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a  xpr plus one..**
5990: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
59a0: 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  te EP_Propagate 
59b0: 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45 78  flags up from Ex
59c0: 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45 78  pr.x.pList to Ex
59d0: 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20  pr.flags,.** if 
59e0: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
59f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5a00: 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a  SetHeight(Expr *
5a10: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
5a20: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
5a30: 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  fExpr(p->pLeft, 
5a40: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
5a50: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69  ghtOfExpr(p->pRi
5a60: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
5a70: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5a90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65  elect) ){.    he
5aa0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
5ab0: 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  x.pSelect, &nHei
5ac0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ght);.  }else if
5ad0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  ( p->x.pList ){.
5ae0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5af0: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
5b00: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   &nHeight);.    
5b10: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5b20: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5b30: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5b40: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5b50: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
5b60: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
5b70: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
5b80: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
5b90: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78  ble using the ex
5ba0: 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75  prSetHeight() fu
5bb0: 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68  nction. If.** th
5bc0: 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  e height is grea
5bd0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ter than the max
5be0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70  imum allowed exp
5bf0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a  ression depth,.*
5c00: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
5c10: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a   in pParse..**.*
5c20: 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65  * Also propagate
5c30: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5c40: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5c50: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5c60: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5c70: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
5c80: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5c90: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
5ca0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
5cb0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
5cc0: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
5cd0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
5ce0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
5cf0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
5d00: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
5d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d20: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5d30: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
5d40: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5d50: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
5d60: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5d70: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
5d80: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
5d90: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
5da0: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
5db0: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
5dc0: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
5dd0: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
5de0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
5df0: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ight;.}.#else /*
5e00: 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74 20   ABOVE:  Height 
5e10: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62  enforcement enab
5e20: 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69  led.  BELOW: Hei
5e30: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e40: 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  off */./*.** Pro
5e50: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5e60: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5e70: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5e80: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
5e90: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
5ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
5eb0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
5ec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5ed0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  r *p){.  if( p &
5ee0: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  & p->x.pList && 
5ef0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5f00: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5f10: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ) ){.    p->flag
5f20: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5f30: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5f40: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5f50: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66  ist);.  }.}.#def
5f60: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
5f70: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
5f80: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5f90: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
5fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5fb0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
5fc0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
5fd0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
5fe0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
5ff0: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
6000: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6010: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
6020: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
6030: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
6040: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
6050: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
6060: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
6070: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
6080: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
6090: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
60a0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
60b0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
60c0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
60d0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
60e0: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
60f0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
6100: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
6110: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
6120: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
6130: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
6140: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
6150: 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51 75 6f  rmed.  The deQuo
6160: 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  te.** parameter 
6170: 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54  is ignored if pT
6180: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20  oken is NULL or 
6190: 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65  if the token doe
61a0: 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20  s not.** appear 
61b0: 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49  to be quoted.  I
61c0: 66 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72  f the quotes wer
61d0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e  e of the form ".
61e0: 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74  .." (double-quot
61f0: 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  es).** then the 
6200: 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61  EP_DblQuoted fla
6210: 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
6220: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e  expression node.
6230: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63  .**.** Special c
6240: 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f  ase:  If op==TK_
6250: 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b  INTEGER and pTok
6260: 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  en points to a s
6270: 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61  tring that.** ca
6280: 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20  n be translated 
6290: 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e  into a 32-bit in
62a0: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
62b0: 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  token is not.** 
62c0: 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b  stored in u.zTok
62d0: 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68  en.  Instead, th
62e0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
62f0: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
6300: 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64  nto u.iValue and
6310: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
6320: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e   flag is set.  N
6330: 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a  o extra storage.
6340: 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ** is allocated 
6350: 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65  to hold the inte
6360: 67 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65  ger text and the
6370: 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73   dequote flag is
6380: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70   ignored..*/.Exp
6390: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c  r *sqlite3ExprAl
63a0: 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  loc(.  sqlite3 *
63b0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
63c0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
63d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
63e0: 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  N() */.  int op,
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6410: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
6420: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
6430: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
6440: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
6450: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
6460: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
6470: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
6480: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
6490: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
64a0: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
64b0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
64c0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
64d0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
64e0: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
64f0: 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65  INTEGER || pToke
6500: 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  n->z==0.        
6510: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
6520: 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  nt32(pToken->z, 
6530: 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  &iValue)==0 ){. 
6540: 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54       nExtra = pT
6550: 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20  oken->n+1;.     
6560: 20 61 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e   assert( iValue>
6570: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
6580: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
6590: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
65a0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e  , sizeof(Expr)+n
65b0: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 4e  Extra);.  if( pN
65c0: 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  ew ){.    memset
65d0: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
65e0: 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70 4e 65  (Expr));.    pNe
65f0: 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a  w->op = (u8)op;.
6600: 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d      pNew->iAgg =
6610: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f   -1;.    if( pTo
6620: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ken ){.      if(
6630: 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20   nExtra==0 ){.  
6640: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
6650: 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
6660: 7c 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20  |EP_Leaf;.      
6670: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
6680: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
6690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
66a0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
66b0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
66c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
66d0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
66e0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
66f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
6700: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
6710: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
6720: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
6730: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
6740: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
6750: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
6760: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
6770: 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71  te && sqlite3Isq
6780: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6790: 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ken[0]) ){.     
67a0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75       if( pNew->u
67b0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20  .zToken[0]=='"' 
67c0: 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d  ) pNew->flags |=
67d0: 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20   EP_DblQuoted;. 
67e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
67f0: 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Dequote(pNew->u.
6800: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  zToken);.       
6810: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6820: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
6830: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
6840: 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d   pNew->nHeight =
6850: 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d   1;.#endif  .  }
6860: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
6880: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
6890: 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a  on node from a z
68a0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  ero-terminated t
68b0: 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a  oken that has.**
68c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
68d0: 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  quoted..*/.Expr 
68e0: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
68f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
6900: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6910: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6920: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
6930: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
6940: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6950: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6960: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
6980: 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ken      /* Toke
6990: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
69a0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
69b0: 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e  .  Token x;.  x.
69c0: 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e  z = zToken;.  x.
69d0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
69e0: 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72  n30(zToken);.  r
69f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
6a00: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
6a10: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
6a20: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
6a30: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
6a40: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
6a50: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
6a60: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
6a70: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
6a80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6a90: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
6aa0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
6ab0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
6ac0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
6ad0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
6ae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
6af0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
6b00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
6b10: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
6b20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
6b30: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
6b40: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
6b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6b60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6b80: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
6b90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6ba0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
6bb0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6bc0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
6bd0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
6be0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
6bf0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
6c00: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
6c10: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
6c20: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
6c30: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
6c40: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
6c50: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
6c60: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c70: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
6c80: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
6c90: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
6ca0: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
6cb0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6cc0: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
6cd0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
6ce0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
6cf0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
6d00: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
6d10: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
6d20: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6d30: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
6d40: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
6d50: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
6d60: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
6d70: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
6d80: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
6d90: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
6da0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
6db0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
6dc0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
6dd0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
6de0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6df0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e10: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6e20: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
6e30: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
6e40: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
6e50: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6e70: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
6e80: 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  ){.  Expr *p;.  
6e90: 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26  if( op==TK_AND &
6ea0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
6eb0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65  0 ){.    /* Take
6ec0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68   advantage of sh
6ed0: 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73  ort-circuit fals
6ee0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  e optimization f
6ef0: 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20  or AND */.    p 
6f00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
6f10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
6f20: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
6f30: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71  else{.    p = sq
6f40: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6f50: 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  NN(pParse->db, s
6f60: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6f70: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
6f80: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
6f90: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6fa0: 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20     p->op = op & 
6fb0: 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  TKFLG_MASK;.    
6fc0: 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a    p->iAgg = -1;.
6fd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6fe0: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
6ff0: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
7000: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
7010: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  );.  }.  if( p )
7020: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
7030: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
7040: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
7050: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7060: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
7070: 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45  pSelect to the E
7080: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69  xpr.x.pSelect fi
7090: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
70a0: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
70b0: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
70c0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
70d0: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
70e0: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
70f0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7100: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
7110: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7120: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c  Expr *pExpr, Sel
7130: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
7140: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
7150: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
7160: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
7170: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
7180: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
7190: 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72  elect|EP_Subquer
71a0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
71b0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
71c0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78  lags(pParse, pEx
71d0: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
71e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
71f0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7200: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
7210: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
7220: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63  arse->db, pSelec
7230: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
7240: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
7250: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
7260: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
7270: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
7280: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
7290: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
72a0: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
72b0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
72c0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
72d0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
72e0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
72f0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
7300: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
7310: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
7320: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
7330: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
7340: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
7350: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
7360: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
7370: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
7380: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
7390: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
73a0: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
73b0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
73c0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
73d0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
73e0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
73f0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
7400: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
7410: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7420: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
7430: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
7440: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
7450: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7460: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
7470: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
7480: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
7490: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
74a0: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
74b0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
74c0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
74d0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
74e0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
74f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7500: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7510: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
7520: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7530: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
7540: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
7550: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
7560: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
7570: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7580: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7590: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
75a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
75b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
75c0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75d0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75e0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75f0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
7600: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
7610: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
7620: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
7630: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
7640: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
7650: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
7660: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
7670: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
7680: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
7690: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
76a0: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
76b0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
76c0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
76d0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
76e0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
76f0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
7700: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
7710: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
7720: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
7730: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
7740: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
7750: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
7760: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
7770: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
7780: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
7790: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
77a0: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
77b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
77c0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
77d0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
77e0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
77f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7800: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
7810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7820: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
7830: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7840: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
7850: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
7860: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
7870: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
7880: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
7890: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
78a0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
78b0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
78c0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
78d0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
78e0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
78f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
7900: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
7910: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
7920: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
7930: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
7940: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
7950: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
7960: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
7970: 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  unction(.  Parse
7980: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7990: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
79a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
79b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f  t *pList,      /
79c0: 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  * Argument list 
79d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  */.  Token *pTok
79e0: 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  en,        /* Na
79f0: 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  me of the functi
7a00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73  on */.  int eDis
7a10: 74 69 6e 63 74 20 20 20 20 20 20 20 20 20 2f 2a  tinct         /*
7a20: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f 72 20   SF_Distinct or 
7a30: 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29  SF_ALL or 0 */.)
7a40: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
7a50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7a60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
7a70: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
7a80: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7a90: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
7aa0: 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65  _FUNCTION, pToke
7ab0: 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65  n, 1);.  if( pNe
7ac0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
7ad0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7ae0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a  e(db, pList); /*
7af0: 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65   Avoid memory le
7b00: 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ak when malloc f
7b10: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
7b20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
7b30: 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
7b40: 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65 2d 3e  nExpr > pParse->
7b50: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7b60: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
7b70: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c  _ARG] ){.    sql
7b80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7b90: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
7ba0: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63  rguments on func
7bb0: 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e  tion %T", pToken
7bc0: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78  );.  }.  pNew->x
7bd0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
7be0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
7bf0: 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75  y(pNew, EP_HasFu
7c00: 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  nc);.  assert( !
7c10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7c20: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7c30: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
7c40: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
7c50: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
7c60: 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69 73 74  ew);.  if( eDist
7c70: 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63  inct==SF_Distinc
7c80: 74 20 29 20 45 78 70 72 53 65 74 50 72 6f 70 65  t ) ExprSetPrope
7c90: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44 69 73  rty(pNew, EP_Dis
7ca0: 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  tinct);.  return
7cb0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
7cc0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
7cd0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
7ce0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
7cf0: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
7d00: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
7d10: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
7d20: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
7d30: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
7d40: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
7d50: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
7d60: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
7d70: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
7d80: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
7d90: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
7da0: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
7db0: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
7dc0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
7dd0: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
7de0: 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f  s not too big to
7df0: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
7e00: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
7e10: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
7e20: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
7e30: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
7e40: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
7e50: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
7e60: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
7e70: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
7e80: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
7e90: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
7ea0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
7eb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7ec0: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
7ed0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
7ee0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
7ef0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
7f00: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
7f10: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
7f20: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
7f30: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
7f40: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
7f50: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
7f60: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7f70: 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b   *pExpr, u32 n){
7f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63   pParse->db;.  c
7fa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
7fb0: 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66 28 20  ynVar x;..  if( 
7fc0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
7fd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
7fe0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
7ff0: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
8000: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
8010: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
8020: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
8030: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
8040: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8050: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73  z[0]!=0 );.  ass
8060: 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c  ert( n==(u32)sql
8070: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
8080: 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30  );.  if( z[1]==0
8090: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
80a0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
80b0: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
80c0: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
80d0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  umber */.    ass
80e0: 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ert( z[0]=='?' )
80f0: 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72  ;.    x = (ynVar
8100: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8110: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8120: 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20  int doAdd = 0;. 
8130: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27     if( z[0]=='?'
8140: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c   ){.      /* Wil
8150: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
8160: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
8170: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
8180: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20  nteger and.     
8190: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
81a0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
81b0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  r */.      i64 i
81c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b  ;.      int bOk;
81d0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20  .      if( n==2 
81e0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
81f0: 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20  N-IF-TRUE*/.    
8200: 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27      i = z[1]-'0'
8210: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
8220: 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20   case of ?N for 
8230: 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e  a single digit N
8240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   */.        bOk 
8250: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
8260: 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  {.        bOk = 
8270: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
8280: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
8290: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
82a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
82b0: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
82c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
82d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
82e0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
82f0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8300: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8310: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
8320: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
8330: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8340: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8350: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
8360: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
8370: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
8380: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8390: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
83a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
83b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
83c0: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
83d0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
83e0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
83f0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
8400: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8410: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8420: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  R]);.        ret
8430: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
8440: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b     x = (ynVar)i;
8450: 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61  .      if( x>pPa
8460: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
8470: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
8480: 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20  r = (int)x;.    
8490: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
84a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
84b0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
84c0: 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
84d0: 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20  ist, x)==0 ){.  
84e0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
84f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
8500: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c  se{.      /* Wil
8510: 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61  dcards like ":aa
8520: 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40  a", "$aaa" or "@
8530: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
8540: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
8550: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61       ** number a
8560: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
8570: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
8580: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
8590: 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he name.      **
85a0: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
85b0: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
85c0: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
85d0: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ble number.     
85e0: 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79   */.      x = (y
85f0: 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73  nVar)sqlite3VLis
8600: 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73  tNameToNum(pPars
8610: 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29  e->pVList, z, n)
8620: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  ;.      if( x==0
8630: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
8640: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
8650: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20  ->nVar);.       
8660: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8680: 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20  ( doAdd ){.     
8690: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
86a0: 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64  = sqlite3VListAd
86b0: 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56  d(db, pParse->pV
86c0: 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a  List, z, n, x);.
86d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
86e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a  r->iColumn = x;.
86f0: 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d    if( x>db->aLim
8700: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8710: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8730: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8740: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
8750: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
8760: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
8770: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
8780: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
8790: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
87a0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71  NOINLINE void sq
87b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
87c0: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
87d0: 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  xpr *p){.  asser
87e0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  t( p!=0 );.  /* 
87f0: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
8800: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
8810: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
8820: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
8830: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
8840: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8850: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
8860: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
8870: 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  >=0 );..  assert
8880: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8890: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
88a0: 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 21 3d  ) || p->y.pWin!=
88b0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
88c0: 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
88d0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  t( p->op!=TK_FUN
88e0: 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48 61 73  CTION || ExprHas
88f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
8900: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
8910: 63 65 64 29 0a 20 20 20 20 20 20 20 20 20 20 7c  ced).          |
8920: 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30 20 7c  | p->y.pWin==0 |
8930: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
8940: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8950: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
8960: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
8970: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8980: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
8990: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
89a0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
89b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
89c0: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
89d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
89e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
89f0: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8a00: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8a10: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8a20: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8a30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8a40: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8a50: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8a60: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8a70: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8a80: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
8a90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8aa0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
8ab0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8ac0: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8ad0: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8ae0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8af0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8b00: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8b10: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8b20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b30: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8b40: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8b50: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
8b60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8b70: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
8b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
8b90: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
8ba0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8bc0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8bd0: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8be0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
8bf0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8c00: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
8c20: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  t( p->op==TK_FUN
8c30: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73  CTION );.      s
8c40: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
8c50: 74 65 28 64 62 2c 20 70 2d 3e 79 2e 70 57 69 6e  te(db, p->y.pWin
8c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
8c70: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8c80: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
8c90: 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  n) ) sqlite3DbFr
8ca0: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
8cb0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  en);.  if( !Expr
8cc0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8cd0: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
8ce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
8cf0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76  (db, p);.  }.}.v
8d00: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
8d10: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
8d20: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
8d30: 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78  f( p ) sqlite3Ex
8d40: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8d50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
8d60: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8d70: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
8d80: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
8d90: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a  ion structure .*
8da0: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
8db0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8dc0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f  This is always o
8dd0: 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53  ne of EXPR_FULLS
8de0: 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44  IZE,.** EXPR_RED
8df0: 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52  UCEDSIZE or EXPR
8e00: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a  _TOKENONLYSIZE..
8e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
8e20: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8e30: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
8e40: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8e50: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20  EP_TokenOnly) ) 
8e60: 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45  return EXPR_TOKE
8e70: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
8e80: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8e90: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
8ea0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
8eb0: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
8ec0: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
8ed0: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E;.}../*.** The 
8ee0: 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29  dupedExpr*Size()
8ef0: 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72   routines each r
8f00: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8f10: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
8f20: 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61  ed.** to store a
8f30: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
8f40: 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73  ession or expres
8f50: 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79  sion tree.  They
8f60: 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f   differ in.** ho
8f70: 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72  w much of the tr
8f80: 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a  ee is measured..
8f90: 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  **.**     dupedE
8fa0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
8fb0: 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79      Size of only
8fc0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8fd0: 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65  ure .**     dupe
8fe0: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20  dExprNodeSize() 
8ff0: 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78        Size of Ex
9000: 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74  pr + space for t
9010: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65  oken.**     dupe
9020: 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20  dExprSize()     
9030: 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b        Expr + tok
9040: 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d  en + subtree com
9050: 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a  ponents.**.*****
9060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
90b0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
90c0: 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Size() function 
90d0: 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75  returns two valu
90e0: 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  es OR-ed togethe
90f0: 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20  r:  .** (1) the 
9100: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
9110: 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  or a copy of the
9120: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
9130: 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29  only and .** (2)
9140: 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67   the EP_xxx flag
9150: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20  s that indicate 
9160: 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  what the structu
9170: 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  re size should b
9180: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
9190: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
91a0: 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  s one of:.**.** 
91b0: 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49       EXPR_FULLSI
91c0: 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ZE.**      EXPR_
91d0: 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20  REDUCEDSIZE   | 
91e0: 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20  EP_Reduced.**   
91f0: 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c     EXPR_TOKENONL
9200: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
9210: 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  Only.**.** The s
9220: 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63  ize of the struc
9230: 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ture can be foun
9240: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
9250: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
9260: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
9270: 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68   with 0xfff.  Th
9280: 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66  e flags can be f
9290: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
92a0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
92b0: 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75  lue with EP_Redu
92c0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
92d0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
92e0: 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58  t with flags==EX
92f0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68  PRDUP_REDUCE, th
9300: 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b  is routines work
9310: 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a  s on full-size.*
9320: 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78  * (unreduced) Ex
9330: 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68  pr objects as th
9340: 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79  ey or originally
9350: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
9360: 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44  the parser..** D
9370: 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  uring expression
9380: 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61   analysis, extra
9390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
93a0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76  computed and mov
93b0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72  ed into.** later
93c0: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 45 78   parts of the Ex
93d0: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  pr object and th
93e0: 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  at extra informa
93f0: 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63  tion might get c
9400: 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66  hopped.** off if
9410: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9420: 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74  is reduced.  Not
9430: 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64  e also that it d
9440: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a  oes not work to.
9450: 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44  ** make an EXPRD
9460: 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f  UP_REDUCE copy o
9470: 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72  f a reduced expr
9480: 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f  ession.  It is o
9490: 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20  nly legal.** to 
94a0: 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e  reduce a pristin
94b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
94c0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65  e from the parse
94d0: 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  r.  The implemen
94e0: 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70  tation.** of dup
94f0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9500: 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69  () contain multi
9510: 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ple assert() sta
9520: 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74  tements that att
9530: 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72  empt.** to enfor
9540: 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ce this constrai
9550: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
9560: 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  t dupedExprStruc
9570: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  tSize(Expr *p, i
9580: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
9590: 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74   nSize;.  assert
95a0: 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  ( flags==EXPRDUP
95b0: 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73  _REDUCE || flags
95c0: 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f  ==0 ); /* Only o
95d0: 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c  ne flag value al
95e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  lowed */.  asser
95f0: 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  t( EXPR_FULLSIZE
9600: 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73  <=0xfff );.  ass
9610: 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45  ert( (0xfff & (E
9620: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
9630: 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20  enOnly))==0 );. 
9640: 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c   if( 0==flags ||
9650: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
9660: 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64 65  T_COLUMN .#ifnde
9670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
9680: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c 20 45  NDOWFUNC.   || E
9690: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
96a0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 0a 23 65  , EP_WinFunc).#e
96b0: 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 6e 53  ndif.  ){.    nS
96c0: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
96d0: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
96e0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
96f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9700: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
9710: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
9720: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9730: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
9740: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
9750: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9760: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
9770: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
9780: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9790: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
97a0: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
97b0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
97c0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
97d0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
97e0: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
97f0: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
9800: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9810: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
9820: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
9830: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9840: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
9850: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
9860: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
9870: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9880: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
9890: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
98a0: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
98b0: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
98c0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
98d0: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
98e0: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
98f0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
9900: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
9910: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
9920: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9930: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
9940: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
9950: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
9960: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9970: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
9980: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
9990: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
99a0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
99b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
99c0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
99d0: 74 65 33 53 74 72 6c 65 6e 33 30 4e 4e 28 70 2d  te3Strlen30NN(p-
99e0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
99f0: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
9a00: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
9a10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9a20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
9a30: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
9a40: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
9a50: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
9a60: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
9a70: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
9a80: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
9a90: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
9aa0: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
9ab0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
9ac0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
9ad0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
9ae0: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
9af0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
9b00: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
9b10: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
9b20: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
9b30: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
9b40: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
9b50: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
9b60: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
9b70: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
9b80: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
9b90: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
9ba0: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
9bb0: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
9bc0: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
9bd0: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
9be0: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
9bf0: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
9c00: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
9c10: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
9c20: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
9c30: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
9c40: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
9c50: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
9c60: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
9c70: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
9c80: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9c90: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9ca0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
9cb0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
9cc0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
9cd0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9ce0: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
9cf0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
9d00: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
9d10: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
9d20: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
9d30: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
9d40: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
9d50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
9d60: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
9d70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
9d80: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
9d90: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
9da0: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
9db0: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
9dc0: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
9dd0: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
9de0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
9df0: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
9e00: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
9e10: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
9e20: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
9e30: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
9e40: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
9e50: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
9e60: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
9e70: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
9e80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
9e90: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
9ea0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
9eb0: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
9ec0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
9ed0: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
9ee0: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
9ef0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
9f00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9f10: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
9f20: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
9f30: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
9f40: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
9f50: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
9f60: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
9f70: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
9f80: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
9f90: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
9fa0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
9fb0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
9fc0: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
9fd0: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
9fe0: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
9ff0: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
a000: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
a010: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
a020: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
a030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
a040: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
a050: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
a060: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
a070: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
a080: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
a090: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
a0a0: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
a0b0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
a0c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
a0d0: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
a0e0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
a0f0: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
a100: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
a110: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
a120: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
a130: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
a140: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a150: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
a160: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
a170: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
a180: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
a190: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
a1a0: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
a1b0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
a1c0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
a1d0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
a1e0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
a1f0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
a200: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
a210: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
a220: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
a230: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
a240: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
a250: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
a260: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
a270: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a280: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
a290: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
a2a0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
a2b0: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
a2c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
a2d0: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
a2e0: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
a2f0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
a300: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
a310: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
a320: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
a330: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
a340: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
a350: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a360: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
a370: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
a380: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
a390: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a3a0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
a3b0: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
a3c0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
a3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a3e0: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
a3f0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
a400: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a410: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
a420: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
a430: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
a440: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a450: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
a460: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
a470: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
a480: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
a490: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
a4a0: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
a4b0: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
a4c0: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
a4d0: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
a4e0: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
a4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a500: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
a510: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
a520: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
a530: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
a540: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
a550: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
a560: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
a570: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
a580: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
a590: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
a5a0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
a5b0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
a5c0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
a5d0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a5e0: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
a5f0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
a600: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
a610: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
a620: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
a630: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
a640: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
a650: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
a660: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
a670: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
a680: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
a690: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
a6a0: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
a6b0: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
a6c0: 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65  lags) & (EP_Toke
a6d0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
a6e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a6f0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a700: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a710: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a720: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a730: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a740: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a750: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a760: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a770: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a780: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a790: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a7b0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a7c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a7d0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a7e0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a800: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a810: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a820: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a830: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a840: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a850: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a860: 79 7c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  y|EP_WinFunc) ){
a870: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d  .      zAlloc +=
a880: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
a890: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b  ze(p, dupFlags);
a8a0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
a8b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a8c0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
a8d0: 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  P_Leaf) ){.     
a8e0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a8f0: 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20   p->pLeft ?.    
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d    exprDup(db, p-
a920: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
a930: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
a940: 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   : 0;.        pN
a950: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e  ew->pRight = p->
a960: 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20  pRight ?.       
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
a990: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
a9a0: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20  EDUCE, &zAlloc) 
a9b0: 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  : 0;.      }.#if
a9c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9d0: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
a9e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a9f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
aa00: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
aa10: 70 4e 65 77 2d 3e 79 2e 70 57 69 6e 20 3d 20 73  pNew->y.pWin = s
aa20: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
aa30: 64 62 2c 20 70 4e 65 77 2c 20 70 2d 3e 79 2e 70  db, pNew, p->y.p
aa40: 57 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Win);.        as
aa50: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
aa60: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 57  perty(pNew, EP_W
aa70: 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20  inFunc) );.     
aa80: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
aa90: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
aaa0: 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  UNC */.      if(
aab0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
aac0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
aad0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
aae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aaf0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
ab00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
ab10: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
ab20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
ab30: 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  New->op==TK_SELE
ab40: 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  CT_COLUMN ){.   
ab50: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
ab60: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20  ft = p->pLeft;. 
ab70: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ab80: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c   p->iColumn==0 |
ab90: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
aba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
abb0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
abc0: 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d    || p->pRight==
abd0: 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  p->pLeft );.    
abe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
abf0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
ac00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
ac10: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
ac20: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
ac30: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
ac40: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
ac50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
ac60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ac70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ac80: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
ac90: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
aca0: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
acb0: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
acc0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
acd0: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
ace0: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
acf0: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
ad00: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
ad10: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
ad20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ad30: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
ad40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad50: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
ad60: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
ad70: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
ad80: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
ad90: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
ada0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
adb0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
adc0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
add0: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
ade0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
adf0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ae00: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
ae10: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
ae20: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
ae30: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
ae40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ae50: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
ae60: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
ae70: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
ae80: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
ae90: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
aea0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
aeb0: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
aec0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
aed0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
aee0: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
aef0: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
af00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
af10: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
af20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
af30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
af40: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
af50: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
af60: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
af70: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
af80: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
af90: 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74 68  C./*.** The gath
afa0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
afb0: 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64 20  ) procedure and 
afc0: 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  its helper routi
afd0: 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c 65  ne.** gatherSele
afe0: 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63  ctWindowsCallbac
aff0: 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f 20  k() are used to 
b000: 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  scan all the exp
b010: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20 61  ressions.** an a
b020: 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74 65   newly duplicate
b030: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
b040: 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61 6c  nt and gather al
b050: 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 0a  l of the Window.
b060: 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e 64  ** objects found
b070: 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c 69   there, assembli
b080: 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68 65  ng them onto the
b090: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74 20   linked list at 
b0a0: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a 2f  Select->pWin..*/
b0b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
b0c0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
b0d0: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
b0e0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
b0f0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
b100: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
b110: 49 4f 4e 20 26 26 20 70 45 78 70 72 2d 3e 79 2e  ION && pExpr->y.
b120: 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 61  pWin!=0 ){.    a
b130: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
b140: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
b150: 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20  _WinFunc) );.   
b160: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e   pExpr->y.pWin->
b170: 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61 6c 6b  pNextWin = pWalk
b180: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70  er->u.pSelect->p
b190: 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b 65 72  Win;.    pWalker
b1a0: 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69  ->u.pSelect->pWi
b1b0: 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  n = pExpr->y.pWi
b1c0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
b1d0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
b1e0: 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68 65  static int gathe
b1f0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
b200: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57 61 6c  lectCallback(Wal
b210: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
b220: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 74 75  lect *p){.  retu
b230: 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  rn p==pWalker->u
b240: 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43 5f 43  .pSelect ? WRC_C
b250: 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f 50 72  ontinue : WRC_Pr
b260: 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  une;.}.static vo
b270: 69 64 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  id gatherSelectW
b280: 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20 2a 70  indows(Select *p
b290: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
b2a0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
b2b0: 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74 57   = gatherSelectW
b2c0: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 3b 0a  indowsCallback;.
b2d0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b2e0: 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65  ack = gatherSele
b2f0: 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43  ctWindowsSelectC
b300: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b310: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
b320: 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65 63 74  0;.  w.u.pSelect
b330: 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57   = p;.  sqlite3W
b340: 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 29  alkSelect(&w, p)
b350: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
b360: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b370: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
b380: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
b390: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
b3a0: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
b3b0: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
b3c0: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
b3d0: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
b3e0: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
b3f0: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
b400: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
b410: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
b420: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
b430: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
b440: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
b450: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
b460: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
b470: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
b480: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
b490: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b4a0: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
b4b0: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
b4c0: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
b4d0: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
b4e0: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
b4f0: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
b500: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
b510: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
b520: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
b530: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
b540: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
b550: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
b560: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
b570: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
b580: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
b590: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
b5a0: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
b5b0: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
b5c0: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
b5d0: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
b5e0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
b5f0: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
b600: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
b610: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
b620: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
b630: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
b640: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
b650: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
b660: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b670: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b680: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
b690: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
b6a0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b6b0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
b6c0: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
b6d0: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
b6e0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
b6f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
b700: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
b710: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
b720: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
b730: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
b740: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
b750: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b760: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b770: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
b780: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b790: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b7a0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b7b0: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b7c0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b7d0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b7e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b7f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b800: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b810: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b820: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b830: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b840: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b850: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b860: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b870: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b880: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b890: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b8a0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b8b0: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b8c0: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b8d0: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b8e0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b8f0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b900: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b910: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b920: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b930: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b940: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b950: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b960: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b970: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b980: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b990: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b9a0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b9b0: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b9c0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b9d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b9e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b9f0: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
ba00: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
ba10: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
ba20: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
ba30: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
ba40: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
ba50: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
ba60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ba70: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
ba80: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
ba90: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
baa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
bab0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
bac0: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
bad0: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
bae0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
baf0: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
bb00: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
bb10: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
bb20: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
bb30: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
bb40: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
bb50: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
bb60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
bb70: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bb80: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
bb90: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
bba0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bbb0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
bbc0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
bbd0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
bbe0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
bbf0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
bc00: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
bc10: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
bc20: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
bc30: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62  ab;.    pItem->b
bc40: 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64  SorterRef = pOld
bc50: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
bc60: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
bc70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
bc80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
bc90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
bca0: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
bcb0: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
bcc0: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
bcd0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
bce0: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
bcf0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
bd00: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
bd10: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
bd20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
bd30: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
bd40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
bd50: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
bd60: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
bd70: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
bd80: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
bd90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
bda0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bdb0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
bdc0: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
bdd0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
bde0: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
bdf0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
be00: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
be10: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
be20: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
be30: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
be40: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
be50: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
be60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
be70: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
be80: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
be90: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
bea0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
beb0: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
bec0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bed0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bee0: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
bef0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
bf00: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
bf10: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
bf20: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
bf30: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
bf40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
bf50: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
bf60: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
bf70: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
bf80: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
bf90: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
bfa0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
bfb0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
bfc0: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
bfd0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
bfe0: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
bff0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
c000: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c010: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
c020: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
c030: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
c040: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c050: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
c060: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c070: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
c080: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c090: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
c0a0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
c0b0: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
c0c0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c0d0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
c0e0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
c0f0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
c100: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
c110: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
c120: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
c130: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
c140: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
c150: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
c160: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
c170: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
c180: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
c190: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c1a0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c1b0: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
c1c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
c1d0: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
c1e0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
c1f0: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
c200: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
c210: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
c220: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
c230: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
c240: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c250: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c260: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
c270: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
c280: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
c290: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
c2a0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
c2b0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
c2c0: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
c2d0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
c2e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
c2f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
c300: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
c310: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
c320: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
c330: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c340: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
c350: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c360: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
c370: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
c380: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c390: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
c3a0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
c3b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
c3c0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
c3d0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
c3e0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
c3f0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
c400: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
c410: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
c420: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
c430: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
c440: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c450: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
c460: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c470: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
c480: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
c490: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
c4a0: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
c4b0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
c4c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c4d0: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
c4e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
c4f0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
c500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
c510: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77  bFreeNN(db, pNew
c520: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c530: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
c540: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
c550: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
c560: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
c570: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
c580: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
c590: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
c5a0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
c5b0: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
c5c0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
c5d0: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
c5e0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
c5f0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
c600: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
c610: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c620: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
c630: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
c640: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c650: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
c660: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
c670: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
c680: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c690: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c6a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
c6b0: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
c6c0: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
c6d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c6e0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
c6f0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
c700: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
c710: 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Dup, int flags){
c720: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20  .  Select *pRet 
c730: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
c740: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Next = 0;.  Sele
c750: 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ct **pp = &pRet;
c760: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20  .  Select *p;.. 
c770: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c780: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20  ;.  for(p=pDup; 
c790: 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b  p; p=p->pPrior){
c7a0: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
c7b0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c7c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c7d0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69  eof(*p) );.    i
c7e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65  f( pNew==0 ) bre
c7f0: 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  ak;.    pNew->pE
c800: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c810: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c820: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
c830: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  .    pNew->pSrc 
c840: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
c850: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
c860: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c870: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
c880: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c890: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
c8a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
c8b0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
c8c0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c8d0: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
c8e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61  );.    pNew->pHa
c8f0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
c900: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
c910: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
c920: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
c930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c940: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
c950: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
c960: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d     pNew->op = p-
c970: 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  >op;.    pNew->p
c980: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
c990: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
c9a0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c   0;.    pNew->pL
c9b0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
c9c0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
c9d0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  mit, flags);.   
c9e0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
c9f0: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
ca00: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
ca10: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
ca20: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
ca30: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
ca40: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
ca50: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
ca60: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
ca70: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
ca80: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
ca90: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
caa0: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
cab0: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
cac0: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23  db, p->pWith);.#
cad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cae0: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
caf0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30    pNew->pWin = 0
cb00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  ;.    pNew->pWin
cb10: 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69  Defn = sqlite3Wi
cb20: 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20  ndowListDup(db, 
cb30: 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20  p->pWinDefn);.  
cb40: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 20    if( p->pWin ) 
cb50: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
cb60: 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64 69  ows(pNew);.#endi
cb70: 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49  f.    pNew->selI
cb80: 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20  d = p->selId;.  
cb90: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
cba0: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
cbb0: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
cbc0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
cbd0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
cbe0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
cbf0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
cc00: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
cc10: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
cc20: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
cc30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
cc40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
cc50: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
cc60: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
cc70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
cc80: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
cc90: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
cca0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
ccb0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
ccc0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
ccd0: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
cce0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
ccf0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
cd00: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
cd10: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
cd20: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
cd30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cd40: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
cd50: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
cd60: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
cd70: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
cd80: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cd90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cda0: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
cdb0: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
cdc0: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
cdd0: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
cde0: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
cdf0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
ce00: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
ce10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
ce20: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
ce30: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
ce40: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
ce50: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
ce60: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
ce70: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
ce80: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
ce90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
cea0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
ceb0: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
cec0: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
ced0: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
cee0: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
cef0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
cf00: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
cf10: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
cf20: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
cf30: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
cf40: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
cf50: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
cf60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cf70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
cf80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cf90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cfa0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
cfb0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
cfc0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
cfd0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
cfe0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
cff0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
d000: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d010: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d020: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
d030: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d040: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d050: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d060: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
d070: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
d080: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
d090: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
d0a0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
d0b0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
d0c0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
d0d0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
d0e0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
d0f0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
d100: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
d110: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
d120: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
d130: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
d140: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
d150: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
d160: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
d170: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
d180: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
d190: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
d1a0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
d1b0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
d1c0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
d1d0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
d1e0: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
d1f0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
d200: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d210: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
d220: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d230: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d240: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
d250: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
d260: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
d270: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d280: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
d290: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
d2a0: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
d2b0: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
d2c0: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
d2d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
d2e0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
d2f0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
d300: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
d310: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
d320: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
d330: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
d340: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
d350: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
d360: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
d370: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
d380: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
d390: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
d3a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
d3b0: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
d3c0: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
d3d0: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
d3e0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
d3f0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
d400: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
d410: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
d420: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
d430: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
d440: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
d450: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
d460: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
d470: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
d480: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
d490: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
d4a0: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
d4b0: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
d4c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d4d0: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
d4e0: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
d4f0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
d500: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
d510: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
d520: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
d530: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
d540: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
d550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d560: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
d570: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d580: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d590: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
d5a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
d5b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
d5c0: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
d5d0: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
d5e0: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
d5f0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
d600: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
d610: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
d620: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
d630: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
d640: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
d650: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
d660: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d670: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
d680: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
d690: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
d6a0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
d6b0: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
d6c0: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
d6d0: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
d6e0: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
d6f0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
d700: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
d710: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
d720: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
d730: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
d740: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
d750: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d760: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
d770: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
d780: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
d790: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
d7a0: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
d7b0: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
d7c0: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
d7d0: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
d7e0: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
d7f0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
d800: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
d810: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
d820: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
d830: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d840: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d850: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d860: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d870: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d880: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d890: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d8a0: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d8b0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d8c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d8d0: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d8e0: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d8f0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d900: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d910: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d920: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d930: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d940: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d960: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d970: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d980: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d990: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d9a0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d9b0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d9c0: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d9d0: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d9e0: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d9f0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
da00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
da10: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
da20: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
da30: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
da40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
da50: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
da60: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
da70: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
da80: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
da90: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
daa0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
dab0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
dac0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
dad0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
dae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
daf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
db00: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
db10: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
db20: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
db30: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
db40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
db50: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
db60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
db70: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
db80: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
db90: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
dba0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
dbb0: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
dbc0: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
dbd0: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
dbe0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dbf0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
dc00: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
dc10: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
dc20: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
dc30: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
dc40: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
dc50: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
dc60: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
dc70: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
dc80: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
dc90: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
dca0: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
dcb0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
dcc0: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
dcd0: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
dce0: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
dcf0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
dd00: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
dd10: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
dd20: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
dd30: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
dd40: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
dd50: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
dd60: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
dd70: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
dd80: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
dd90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dda0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
ddb0: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
ddc0: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
ddd0: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
dde0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
ddf0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
de00: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
de10: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
de20: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
de30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
de40: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
de50: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
de60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
de70: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
de80: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
de90: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
dea0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
deb0: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
dec0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
ded0: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
dee0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
def0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
df00: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
df10: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
df20: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
df30: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
df40: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
df50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
df60: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
df70: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
df80: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
df90: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
dfa0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
dfb0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
dfc0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
dfd0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
dfe0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
dff0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
e000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
e010: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e020: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e030: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e040: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
e050: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
e060: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
e070: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e080: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
e090: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
e0a0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
e0b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
e0c0: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
e0d0: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
e0e0: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
e0f0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e100: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
e110: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
e120: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
e130: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
e140: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e150: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e160: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e170: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
e180: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
e190: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
e1a0: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
e1b0: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
e1c0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
e1d0: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
e1e0: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
e1f0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
e200: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
e210: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
e220: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  m->zName);.    i
e230: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
e240: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
e250: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
e260: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
e270: 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  *)pItem->zName, 
e280: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
e290: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
e2a0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
e2b0: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
e2c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e2d0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
e2e0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
e2f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
e300: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
e310: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
e320: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
e330: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
e340: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
e350: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
e360: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
e370: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e380: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e390: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e3a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e3b0: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
e3c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e3d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e3e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e3f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e400: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e410: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e420: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73   span. */.  cons
e430: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
e440: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
e450: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f  the span */.  co
e460: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
e470: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
e480: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20  the span */.){. 
e490: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e4a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
e4b0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e4c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e4d0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
e4e0: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
e4f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e500: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
e510: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
e520: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
e530: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e550: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e560: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e570: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
e580: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
e590: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
e5a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
e5b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e5c0: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
e5d0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
e5e0: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
e5f0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
e600: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
e610: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e620: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
e630: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
e640: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
e650: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
e660: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
e670: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
e680: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
e690: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
e6a0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
e6b0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
e6c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
e6d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e6e0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
e6f0: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
e700: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
e710: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
e720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e730: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e740: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
e750: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
e760: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
e770: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
e780: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e790: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
e7a0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
e7b0: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
e7c0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
e7d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e7e0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73  {.  int i = pLis
e7f0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75  t->nExpr;.  stru
e800: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e810: 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74   *pItem =  pList
e820: 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ->a;.  assert( p
e830: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e840: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
e850: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
e860: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
e870: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e880: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
e890: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
e8a0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e8b0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
e8c0: 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  tem++;.  }while(
e8d0: 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69   --i>0 );.  sqli
e8e0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
e8f0: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
e900: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
e910: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
e920: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e930: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
e940: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
e950: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e970: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
e980: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
e990: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
e9a0: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
e9b0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
e9c0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
e9d0: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
e9e0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
e9f0: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73  u32 m = 0;.  ass
ea00: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
ea10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
ea20: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
ea30: 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  {.     Expr *pEx
ea40: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
ea50: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73  .pExpr;.     ass
ea60: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
ea70: 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72  .     m |= pExpr
ea80: 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72  ->flags;.  }.  r
ea90: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
eaa0: 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45  * This is a SELE
eab0: 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  CT-node callback
eac0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
ead0: 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a  ion walker that.
eae0: 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73  ** always "fails
eaf0: 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e  ".  By "fail" in
eb00: 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d   this case, we m
eb10: 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b  ean set.** pWalk
eb20: 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72  er->eCode to zer
eb30: 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a  o and abort..**.
eb40: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
eb50: 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74   is used by mult
eb60: 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  iple expression 
eb70: 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  walkers..*/.int 
eb80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
eb90: 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57  kFail(Walker *pW
eba0: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
ebb0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
ebc0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
ebd0: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
ebe0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
ebf0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ec00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
ec10: 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
ec20: 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20 74   is an ID with t
ec30: 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f  he name "true" o
ec40: 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65  r "false".** the
ec50: 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74  n convert it int
ec60: 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53  o an TK_TRUEFALS
ec70: 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  E term.  Return 
ec80: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74  non-zero if.** t
ec90: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61  he conversion ha
eca0: 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f  ppened, and zero
ecb0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
ecc0: 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  on is unaltered.
ecd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ece0: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
ecf0: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
ed00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ed10: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78  op==TK_ID || pEx
ed20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pr->op==TK_STRIN
ed30: 47 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  G );.  if( sqlit
ed40: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ed50: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65  >u.zToken, "true
ed60: 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69  ")==0.   || sqli
ed70: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
ed80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c  ->u.zToken, "fal
ed90: 73 65 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  se")==0.  ){.   
eda0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
edb0: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72  TRUEFALSE;.    r
edc0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
edd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ede0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
edf0: 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45  ust be a TK_TRUE
ee00: 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e  FALSE Expr node.
ee10: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74    Return 1 if it
ee20: 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20   is TRUE.** and 
ee30: 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45  0 if it is FALSE
ee40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee50: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63  ExprTruthValue(c
ee60: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
ee70: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
ee80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  pr->op==TK_TRUEF
ee90: 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ALSE );.  assert
eea0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
eeb0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
eec0: 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20  ,"true")==0.    
eed0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
eee0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
eef0: 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30  oken,"false")==0
ef00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   );.  return pEx
ef10: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d  pr->u.zToken[4]=
ef20: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  =0;.}.../*.** Th
ef30: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
ef40: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
ef50: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
ef60: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
ef70: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
ef80: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
ef90: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
efa0: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
efb0: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
efc0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
efd0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
efe0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
eff0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f010: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f020: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f030: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f040: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f050: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f060: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f070: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f080: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f090: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f0a0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f0b0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f0c0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f0e0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f100: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f110: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f120: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f130: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f140: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f150: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f160: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f170: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f180: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f190: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f1a0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f1b0: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f1c0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f1d0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f1e0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f1f0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f200: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f210: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f220: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f230: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f240: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f250: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f260: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f270: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f280: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f290: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f2a0: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f2b0: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f2c0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f2d0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f2e0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f2f0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f300: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f310: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f320: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f330: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f340: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f350: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f360: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f370: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f380: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f390: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f3a0: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f3b0: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f3c0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f3d0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f3e0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f3f0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f400: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f410: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f420: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f430: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f440: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f450: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f460: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f470: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f480: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f490: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f4a0: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f4c0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f4d0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f4e0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f4f0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f500: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f510: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f520: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f530: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f540: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f550: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f560: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f570: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f580: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f590: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f5a0: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f5b0: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f5c0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f5d0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f5e0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f5f0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
f600: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
f610: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
f620: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
f630: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
f640: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f650: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
f660: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
f670: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
f680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f690: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f6b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f6c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f6d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f6e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f6f0: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
f700: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
f710: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
f720: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
f730: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
f740: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
f750: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
f760: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
f770: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
f780: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
f790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f7a0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f7b0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f7c0: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
f7d0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
f7e0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
f7f0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
f800: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
f810: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f820: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
f830: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f840: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f850: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
f860: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f870: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
f880: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
f890: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f8a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
f8b0: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
f8c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f8d0: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
f8e0: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
f8f0: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
f900: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f910: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
f920: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
f930: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
f940: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
f950: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
f960: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f970: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
f980: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f990: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f9a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
f9b0: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
f9c0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
f9d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f9e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
f9f0: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fa00: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fa10: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fa20: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fa30: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fa40: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fa50: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fa60: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fa70: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fa80: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fa90: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
faa0: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
fab0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fac0: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fad0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fae0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
faf0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
fb00: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
fb10: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
fb20: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
fb30: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fb40: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
fb50: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
fb60: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
fb70: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
fb80: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
fb90: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
fba0: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
fbb0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fbc0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
fbd0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
fbe0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fbf0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
fc00: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
fc10: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
fc20: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fc30: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fc40: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
fc50: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
fc60: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
fc70: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fc80: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fc90: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fca0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fcb0: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fcc0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fcd0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
fce0: 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
fcf0: 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
fd00: 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
fd10: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
fd20: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
fd30: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
fd40: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
fd50: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
fd60: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
fd70: 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
fd80: 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
fd90: 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
fda0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
fdb0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
fdc0: 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
fdd0: 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
fde0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
fdf0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
fe00: 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
fe10: 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
fe20: 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
fe30: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
fe40: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
fe50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
fe60: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
fe70: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
fe80: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
fe90: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
fea0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
feb0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
fec0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
fed0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
fee0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
fef0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
ff00: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
ff10: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
ff20: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
ff30: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
ff40: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
ff50: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
ff60: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
ff70: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
ff80: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
ff90: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
ffa0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
ffb0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
ffc0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
ffd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
ffe0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
fff0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
10000 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
10010 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
10020 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
10030 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
10040 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10050 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10060 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10070 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10080 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10090 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
100a0 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
100b0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
100c0 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
100d0 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
100e0 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
100f0 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
10100 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
10110 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
10120 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
10130 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
10140 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
10150 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10160 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10170 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10180 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10190 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
101a0 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
101b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
101c0 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
101d0 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
101e0 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
101f0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
10200 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
10210 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
10220 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10230 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
10240 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10250 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10260 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10270 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10280 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10290 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
102a0 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
102b0 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
102c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
102d0 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
102e0 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
102f0 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
10300 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
10310 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
10320 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
10330 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
10340 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
10350 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10360 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10370 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10380 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10390 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
103a0 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
103b0 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
103c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
103d0 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
103e0 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
103f0 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
10400 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
10410 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
10420 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
10430 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
10440 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
10450 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10460 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10470 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10480 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10490 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
104a0 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
104b0 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
104c0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
104d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
104e0 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
104f0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
10500 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10510 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
10520 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
10530 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10540 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10550 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10560 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10570 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10580 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10590 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
105a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
105b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
105c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
105d0 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
105e0 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
105f0 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
10600 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  le. */.  if( Exp
10610 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
10620 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
10630 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
10640 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
10650 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10660 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10670 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10680 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10690 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
106a0 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
106b0 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
106c0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
106d0 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
106e0 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
106f0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
10700 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
10710 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
10720 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
10730 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
10740 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
10750 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10760 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10770 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10780 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10790 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
107a0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
107b0 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
107c0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
107d0 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
107e0 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
107f0 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
10800 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
10810 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
10820 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
10830 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
10840 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
10850 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10860 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10870 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10880 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10890 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
108a0 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
108b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
108c0 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
108d0 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
108e0 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
108f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10900 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10910 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10920 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10930 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10940 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10950 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10960 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10970 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10980 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10990 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
109a0 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
109b0 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
109c0 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
109d0 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
109e0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
109f0 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10a00 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10a10 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10a20 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10a30 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10a40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10a50 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10a60 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10a70 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10a80 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10a90 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10aa0 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10ab0 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10ac0 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10ad0 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10ae0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10af0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10b00 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10b10 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10b20 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10b30 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10b40 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10b50 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10b60 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10b70 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10b80 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10b90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10ba0 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10bb0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10bc0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10bd0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10be0 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10bf0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
10c10 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10c20 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
10c30 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
10c40 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
10c50 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
10c60 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
10c70 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
10c80 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
10c90 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
10ca0 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
10cb0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
10cc0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
10cd0 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
10ce0 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10cf0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
10d00 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
10d10 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
10d20 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10d30 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
10d40 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
10d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10d60 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
10d70 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
10d80 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
10d90 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
10da0 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
10db0 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10dc0 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
10dd0 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
10de0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
10df0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
10e00 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10e10 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10e20 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
10e30 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
10e40 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
10e50 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
10e60 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
10e70 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
10e80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10e90 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
10ea0 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
10eb0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
10ec0 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
10ed0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
10ee0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
10ef0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
10f00 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
10f10 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
10f20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10f30 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
10f40 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
10f50 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
10f60 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
10f70 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10f90 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
10fa0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
10fb0 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
10fc0 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
10fd0 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
10fe0 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
10ff0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
11000 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
11010 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
11020 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
11030 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
11040 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
11050 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11060 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11070 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11080 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11090 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
110a0 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
110b0 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
110c0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
110d0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
110e0 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
110f0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
11100 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
11110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
11120 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
11130 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
11140 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
11150 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11160 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11170 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11180 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11190 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
111a0 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
111b0 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
111c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
111d0 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
111e0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
111f0 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
11200 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
11210 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
11220 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
11230 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
11240 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
11250 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11260 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11270 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11280 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11290 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
112a0 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
112b0 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
112c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
112d0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
112e0 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
112f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11300 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11310 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
11320 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
11330 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
11340 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
11350 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11360 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11370 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11380 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11390 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
113a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
113b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
113c0 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
113d0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
113e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
113f0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
11400 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
11410 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
11420 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
11430 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
11440 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
11450 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11460 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11470 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11480 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11490 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
114a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
114b0 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
114c0 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
114d0 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
114e0 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
114f0 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
11500 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
11510 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
11520 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
11530 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
11540 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
11550 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11560 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11570 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11580 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11590 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
115a0 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
115b0 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
115c0 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
115d0 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
115e0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
115f0 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
11600 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
11610 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
11620 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
11630 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
11640 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
11650 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11660 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11670 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11680 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11690 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
116a0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
116b0 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
116c0 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
116d0 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
116e0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
116f0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
11700 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11710 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11720 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
11730 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
11740 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
11750 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11760 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11770 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11780 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11790 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
117a0 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
117b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
117c0 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
117d0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
117e0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
117f0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
11800 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
11810 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
11820 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
11830 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
11840 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11850 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11860 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11870 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11880 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11890 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
118a0 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
118b0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
118c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
118d0 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
118e0 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
118f0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11900 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11910 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11920 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11930 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11940 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11950 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11960 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11970 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11980 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11990 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
119a0 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
119b0 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
119c0 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
119d0 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
119e0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
119f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11a00 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11a10 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11a20 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11a30 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11a40 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11a50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11a60 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11a70 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11a80 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11a90 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11aa0 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11ab0 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11ac0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11ad0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11ae0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11af0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11b00 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11b10 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11b20 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11b30 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11b40 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11b50 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11b60 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11b70 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11b80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11b90 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11ba0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11bb0 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11bc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11bd0 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11be0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11bf0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11c10 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11c20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11c30 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11c40 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11c50 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11c60 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11c70 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11c80 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11c90 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11ca0 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11cb0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11cc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11cd0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11ce0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11cf0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11d00 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11d10 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11d20 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11d30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11d40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11d50 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11d60 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11d70 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11d80 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11d90 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11da0 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11db0 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11dc0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11dd0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11de0 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
11df0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
11e00 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
11e10 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11e20 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11e30 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11e40 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
11e50 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
11e60 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
11e70 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
11e80 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
11e90 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
11ea0 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
11eb0 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
11ec0 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
11ed0 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
11ee0 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
11ef0 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
11f00 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
11f10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
11f30 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
11f40 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
11f50 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
11f60 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
11f70 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
11f80 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
11f90 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11fa0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
11fb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
11fc0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
11fd0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
11fe0 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
11ff0 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
12000 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
12010 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
12020 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
12030 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
12040 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
12050 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12060 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12080 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12090 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
120a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
120b0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
120c0 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
120d0 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
120e0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
120f0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
12100 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
12110 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
12120 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
12130 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
12140 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
12150 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12160 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12170 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12180 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12190 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
121a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
121b0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121d0 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
121e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
121f0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
12200 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12210 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
12220 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
12230 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
12240 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12250 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12260 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12270 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12290 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
122a0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
122b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
122c0 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
122d0 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
122e0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
122f0 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
12300 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
12310 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
12320 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
12330 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
12340 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
12350 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12360 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12370 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12380 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12390 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
123a0 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
123b0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
123c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
123d0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
123e0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
123f0 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
12400 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
12410 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
12420 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
12430 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
12440 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
12450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12460 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12470 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12480 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12490 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
124a0 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
124b0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
124c0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
124d0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
124e0 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
124f0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
12500 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
12510 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
12520 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12530 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
12540 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
12550 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12560 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12570 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12580 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12590 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
125a0 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
125b0 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
125c0 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
125d0 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
125e0 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
125f0 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
12600 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
12610 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
12620 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
12630 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
12640 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
12650 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12660 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12670 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12680 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12690 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
126a0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
126b0 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
126c0 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
126d0 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
126e0 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
126f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12700 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
12710 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
12720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12730 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
12740 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
12750 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12760 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12770 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12780 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12790 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
127a0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
127b0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
127c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
127d0 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
127e0 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
127f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12800 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
12810 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
12820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12830 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
12840 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12850 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12860 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12870 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12880 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12890 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
128a0 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
128b0 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
128c0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
128d0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
128e0 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
128f0 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12900 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12910 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12920 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12930 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12940 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12950 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12960 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12970 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12980 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12990 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
129a0 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
129b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
129c0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
129d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
129e0 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
129f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12a00 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12a10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12a20 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12a30 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12a40 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12a50 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12a60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12a70 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12a80 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12a90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12aa0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12ab0 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12ac0 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12ad0 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12ae0 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12af0 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12b00 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12b10 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12b20 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12b30 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12b40 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12b50 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12b60 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12b70 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12b80 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12b90 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12ba0 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12bb0 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12bc0 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12bd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12be0 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12bf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12c00 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12c10 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12c20 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12c30 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12c40 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12c50 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12c60 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12c70 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12c80 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12c90 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12ca0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12cb0 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12cc0 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12cd0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12ce0 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12cf0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12d00 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12d10 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12d20 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12d30 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12d40 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
12d70 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
12d80 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
12d90 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
12da0 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
12db0 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
12dc0 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
12df0 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
12e00 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
12e10 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
12e20 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
12e30 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
12e40 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
12e50 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
12e60 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
12e70 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12e80 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
12e90 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
12ea0 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
12eb0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12ec0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12ed0 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
12ee0 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
12ef0 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
12f00 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
12f10 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
12f20 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
12f30 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
12f40 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
12f50 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
12f60 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
12f70 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
12f80 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
12f90 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
12fa0 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
12fb0 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
12fc0 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
12fd0 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
12fe0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
12ff0 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
13000 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
13010 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
13020 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
13030 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
13040 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
13050 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13060 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13070 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13080 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13090 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
130a0 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
130b0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
130c0 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
130d0 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
130e0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
130f0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
13100 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
13110 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
13120 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
13130 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
13140 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
13150 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13160 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13170 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13180 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13190 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
131a0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
131b0 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
131c0 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
131d0 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
131e0 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
131f0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
13200 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
13210 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
13220 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
13230 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
13240 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
13250 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13260 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13270 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13280 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13290 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
132a0 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
132b0 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
132c0 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
132d0 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
132e0 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
132f0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13300 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
13310 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
13320 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
13330 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
13340 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
13350 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13360 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13370 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13380 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13390 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
133a0 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
133b0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
133c0 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
133d0 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
133e0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
133f0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
13400 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
13410 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
13420 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
13430 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
13440 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
13450 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13460 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13470 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13480 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13490 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
134a0 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
134b0 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
134c0 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
134d0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
134e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
134f0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
13500 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
13510 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
13520 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13530 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
13540 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
13550 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13560 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13570 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13580 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13590 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
135a0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
135b0 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
135c0 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
135d0 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
135e0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
135f0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
13600 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
13610 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
13620 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
13630 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
13640 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
13650 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13660 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13670 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13680 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13690 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
136a0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
136b0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
136c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
136d0 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
136e0 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
136f0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
13700 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
13710 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
13720 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
13730 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
13740 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13750 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13760 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13770 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13780 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13790 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
137a0 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
137b0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
137c0 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
137d0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
137e0 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
137f0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
13800 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
13810 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
13820 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13830 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
13840 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13850 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13860 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13870 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13880 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13890 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
138a0 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
138b0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
138c0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
138d0 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
138e0 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
138f0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13900 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13910 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13920 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13930 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13940 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13950 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13960 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13970 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13980 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13990 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
139a0 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
139b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
139c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
139d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
139e0 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
139f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13a00 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13a10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13a20 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13a40 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13a50 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13a60 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13a70 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13a80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13a90 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13aa0 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13ab0 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13ac0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13ad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13ae0 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13af0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13b00 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13b10 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13b20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13b30 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13b40 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13b50 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b70 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13b80 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13b90 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13bc0 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13bd0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13be0 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13c10 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13c20 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13c30 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13c40 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13c50 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13c60 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13c70 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13ca0 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13cb0 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13cc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13cd0 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13ce0 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13cf0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13d00 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13d10 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13d20 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13d30 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13d40 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13d50 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
13d60 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
13d70 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
13d80 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
13d90 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
13da0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
13db0 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
13dc0 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
13dd0 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
13de0 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
13df0 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
13e00 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
13e10 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
13e20 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
13e30 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
13e40 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
13e50 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
13e60 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
13e70 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
13e80 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
13e90 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
13ea0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
13eb0 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
13ec0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13ed0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
13ee0 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
13ef0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
13f00 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
13f10 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
13f20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
13f30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
13f40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
13f50 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
13f60 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
13f70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13f80 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
13f90 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
13fa0 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
13fb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
13fc0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
13fd0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
13fe0 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
13ff0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
14000 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
14010 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
14020 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
14030 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
14040 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
14050 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14060 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14070 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14080 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14090 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
140a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
140b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
140c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
140d0 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
140e0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14100 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
14110 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14140 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
14150 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14160 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14170 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14180 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14190 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
141a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
141b0 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
141c0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
141d0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
141e0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
141f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14200 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
14210 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
14220 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14230 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14240 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
14250 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14260 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14270 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14280 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14290 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
142a0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
142b0 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
142c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
142d0 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
142e0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
142f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14300 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
14310 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14320 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
14330 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
14340 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
14350 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14360 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14370 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14380 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14390 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
143a0 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
143b0 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
143c0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
143d0 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
143e0 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
143f0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
14400 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
14410 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
14420 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
14430 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
14440 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
14450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14460 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14470 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14480 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14490 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
144a0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
144b0 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
144c0 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
144d0 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
144e0 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
144f0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
14500 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
14510 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
14520 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
14530 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
14540 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
14550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14560 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14570 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14580 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14590 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
145a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
145b0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
145c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
145d0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
145e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
145f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
14600 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
14610 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
14620 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
14630 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
14640 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
14650 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14660 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14670 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14680 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14690 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
146a0 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
146b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
146c0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
146d0 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
146e0 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
146f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14700 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
14710 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
14720 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
14730 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
14740 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
14750 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14760 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14770 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14780 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14790 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
147a0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
147b0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
147c0 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
147d0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
147e0 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
147f0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14800 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
14810 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
14820 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
14830 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
14840 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14850 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14860 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14870 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14880 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14890 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
148a0 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
148b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
148c0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
148d0 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
148e0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
148f0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14900 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14910 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14920 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14930 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14940 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14950 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14960 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14970 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14980 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14990 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
149a0 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
149b0 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
149c0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
149d0 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
149e0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
149f0 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14a00 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14a10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14a20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14a30 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14a50 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14a60 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14a70 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14a80 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14a90 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14aa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14ab0 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14ac0 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14ad0 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14ae0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14af0 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14b00 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14b10 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14b20 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14b30 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14b40 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14b50 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14b60 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14b70 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14b80 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14b90 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14ba0 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14bc0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14bd0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14be0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14bf0 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14c10 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14c20 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14c30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14c40 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14c50 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14c60 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14c70 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14c80 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14c90 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14ca0 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14cb0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14cc0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14cd0 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14cf0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14d00 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14d10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14d20 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14d30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14d40 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14d50 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14d60 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14d70 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
14d80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
14d90 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
14da0 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
14db0 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
14dc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14dd0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14de0 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
14df0 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
14e00 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14e10 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e30 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14e40 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
14e50 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
14e60 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
14e70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
14e80 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
14e90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
14ea0 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
14eb0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
14ec0 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
14ed0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
14ee0 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
14ef0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14f00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
14f10 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
14f20 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
14f30 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
14f40 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
14f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
14f60 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
14f70 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
14f80 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
14f90 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
14fa0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
14fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
14fc0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
14fd0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
14fe0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
14ff0 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
15000 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
15010 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
15020 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
15030 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
15040 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15050 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15060 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15070 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15080 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
150a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
150b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
150c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
150d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
150e0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
150f0 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
15100 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
15110 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
15120 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
15130 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
15140 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
15150 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15160 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15170 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15190 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
151a0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
151b0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
151c0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
151d0 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
151e0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
151f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
15200 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
15210 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
15220 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
15230 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
15240 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
15250 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15260 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15270 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15280 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15290 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
152a0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
152b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
152c0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
152d0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
15300 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
15310 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
15320 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
15330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15340 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15350 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15360 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15370 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15380 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15390 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
153a0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
153b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
153c0 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
153d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
153e0 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
153f0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
15400 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
15410 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
15420 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
15430 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
15440 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
15450 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15460 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15470 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15480 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15490 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
154a0 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
154b0 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
154c0 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
154d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
154e0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
154f0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
15500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15510 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
15520 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
15530 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
15540 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
15550 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15560 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15570 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15580 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
155a0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
155b0 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
155c0 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
155d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
155e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
155f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15600 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
15610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15620 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
15630 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
15640 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
15650 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15660 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15670 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15680 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15690 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
156a0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
156b0 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
156c0 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
156d0 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
156e0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
156f0 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
15700 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
15710 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
15720 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
15730 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
15740 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
15750 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15760 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15770 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15780 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15790 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
157a0 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
157b0 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
157c0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
157d0 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
157e0 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
157f0 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
15800 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
15810 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
15820 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
15830 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
15840 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15850 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15860 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15870 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15880 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15890 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
158a0 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
158b0 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
158c0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
158d0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
158e0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
158f0 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15900 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15910 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15920 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15930 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15940 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15950 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15960 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15980 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15990 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
159a0 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
159b0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
159c0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
159d0 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
159e0 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
159f0 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15a00 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15a10 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
15a20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
15a30 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
15a40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15a50 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15a60 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
15a70 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
15a80 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
15a90 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15aa0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15ab0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15ac0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15ad0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15ae0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15af0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15b00 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15b10 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15b20 70 58 2c 20 69 54 61 62 2c 20 65 54 79 70 65 3d  pX, iTab, eType=
15b30 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
15b40 3b 0a 20 20 20 20 69 66 28 20 72 4d 61 79 48 61  ;.    if( rMayHa
15b50 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
15b60 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15b70 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 72  lFlag(v, iTab, r
15b80 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
15b90 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
15ba0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
15bb0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
15bc0 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26  }..  if( aiMap &
15bd0 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15be0 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65  X_INDEX_ASC && e
15bf0 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15c00 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
15c10 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
15c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
15c30 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65  ctorSize(pX->pLe
15c40 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ft);.    for(i=0
15c50 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61  ; i<n; i++) aiMa
15c60 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  p[i] = i;.  }.  
15c70 2a 70 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  *piTab = iTab;. 
15c80 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
15c90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
15ca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15cb0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
15cc0 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
15cd0 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
15ce0 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
15cf0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
15d00 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
15d10 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
15d20 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
15d30 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
15d40 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
15d50 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
15d60 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
15d70 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
15d80 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
15d90 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15da0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
15db0 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
15dc0 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
15dd0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15de0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
15df0 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
15e00 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
15e10 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15e20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15e30 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
15e40 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
15e50 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
15e60 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15e70 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
15e80 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
15e90 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
15ea0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
15eb0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
15ec0 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
15ed0 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
15ee0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
15ef0 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
15f00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15f10 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
15f20 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  l+1);.  if( zRet
15f30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15f40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
15f50 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
15f60 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74  Expr *pA = sqlit
15f70 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
15f80 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
15f90 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73        char a = s
15fa0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
15fb0 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66  ty(pA);.      if
15fc0 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
15fd0 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73       zRet[i] = s
15fe0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
15ff0 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70  inity(pSelect->p
16000 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
16010 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, a);.      }el
16020 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
16030 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d  [i] = a;.      }
16040 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b  .    }.    zRet[
16050 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nVal] = '\0';.  
16060 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
16070 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
16080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16090 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f  UBQUERY./*.** Lo
160a0 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  ad the Parse obj
160b0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
160c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
160d0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a   with an error .
160e0 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68  ** message of th
160f0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
16100 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
16110 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
16120 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20  expected M".*/  
16130 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75   .void sqlite3Su
16140 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72  bselectError(Par
16150 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16160 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78  nActual, int nEx
16170 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pect){.  const c
16180 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62  har *zFmt = "sub
16190 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
161a0 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70  %d columns - exp
161b0 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c  ected %d";.  sql
161c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
161d0 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75  rse, zFmt, nActu
161e0 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a  al, nExpect);.}.
161f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
16200 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
16210 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20  s a vector that 
16220 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e  has been used in
16230 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65   a context where
16240 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65  .** it is not pe
16250 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70  rmitted. If pExp
16260 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
16270 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72  t vector, this r
16280 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73  outine .** loads
16290 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
162a0 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65  t with a message
162b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
162c0 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
162d0 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
162e0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
162f0 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ".**.** Or, if i
16300 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73  t is a regular s
16310 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a  calar vector:.**
16320 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65  .**   "row value
16330 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a   misused".*/   .
16340 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74  void sqlite3Vect
16350 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65  orErrorMsg(Parse
16360 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
16370 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20  pExpr){.#ifndef 
16380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16390 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
163a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
163b0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
163c0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
163d0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
163e0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
163f0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
16400 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
16410 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
16420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16430 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
16440 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ed");.  }.}..#if
16450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16460 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
16470 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16480 61 74 20 77 69 6c 6c 20 63 6f 6e 73 74 72 75 63  at will construc
16490 74 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  t an ephemeral t
164a0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
164b0 61 6c 6c 20 74 65 72 6d 73 0a 2a 2a 20 69 6e 20  all terms.** in 
164c0 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
164d0 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
164e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  IN operator can 
164f0 62 65 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  be in either of 
16500 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a  two.** forms:.**
16510 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
16520 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
16530 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
16540 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
16550 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
16560 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
16570 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
16580 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
16590 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
165a0 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
165b0 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
165c0 65 74 65 72 20 69 73 20 74 68 65 20 49 4e 20 6f  eter is the IN o
165d0 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 63 75  perator.  The cu
165e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
165f0 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  the.** construct
16600 65 64 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61  ed ephermeral ta
16610 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
16620 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
16630 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a   the ephemeral.*
16640 2a 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 75  * table is compu
16650 74 65 64 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ted, the cursor 
16660 6e 75 6d 62 65 72 20 69 73 20 61 6c 73 6f 20 73  number is also s
16670 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
16680 69 54 61 62 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76  iTable,.** howev
16690 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  er the cursor nu
166a0 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 6d 69  mber returned mi
166b0 67 68 74 20 6e 6f 74 20 62 65 20 74 68 65 20 73  ght not be the s
166c0 61 6d 65 2c 20 61 73 20 69 74 20 6d 69 67 68 74  ame, as it might
166d0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75  .** have been du
166e0 70 6c 69 63 61 74 65 64 20 75 73 69 6e 67 20 4f  plicated using O
166f0 50 5f 4f 70 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a  P_OpenDup..**.**
16700 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
16710 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
16720 6f 2c 20 74 68 65 6e 20 4c 48 53 20 6f 66 20 74  o, then LHS of t
16730 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
16740 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
16750 74 6f 20 62 65 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  to be a non-null
16760 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69   integer. In thi
16770 73 20 63 61 73 65 2c 20 74 68 65 20 65 70 68 65  s case, the ephe
16780 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 61 6e 20  meral table can 
16790 62 65 20 61 6e 0a 2a 2a 20 74 61 62 6c 65 20 42  be an.** table B
167a0 2d 54 72 65 65 20 74 68 61 74 20 6b 65 79 65 64  -Tree that keyed
167b0 20 62 79 20 6f 6e 6c 79 20 69 6e 74 65 67 65 72   by only integer
167c0 73 2e 20 20 54 68 65 20 6d 6f 72 65 20 67 65 6e  s.  The more gen
167d0 65 72 61 6c 20 63 61 73 65 73 20 75 73 65 73 0a  eral cases uses.
167e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  ** an index B-Tr
167f0 65 65 20 77 68 69 63 68 20 63 61 6e 20 68 61 76  ee which can hav
16800 65 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 73  e arbitrary keys
16810 2c 20 62 75 74 20 69 73 20 73 6c 6f 77 65 72 20  , but is slower 
16820 74 6f 20 62 6f 74 68 0a 2a 2a 20 72 65 61 64 20  to both.** read 
16830 61 6e 64 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  and write..**.**
16840 20 49 66 20 74 68 65 20 4c 48 53 20 65 78 70 72   If the LHS expr
16850 65 73 73 69 6f 6e 20 28 22 78 22 20 69 6e 20 74  ession ("x" in t
16860 68 65 20 65 78 61 6d 70 6c 65 73 29 20 69 73 20  he examples) is 
16870 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16880 6f 72 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  or.** the SELECT
16890 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
168a0 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
168b0 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
168c0 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nity of that.** 
168d0 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
168e0 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
168f0 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16900 27 78 27 20 61 6e 64 20 74 68 65 0a 2a 2a 20 53  'x' and the.** S
16910 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
16920 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
16930 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
16940 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 2a 2a  inity is used.**
16950 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16960 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16970 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16980 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  y. If neither.**
16990 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
169a0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
169b0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
169c0 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
169d0 69 74 79 0a 2a 2a 20 69 73 20 75 73 65 64 2e 0a  ity.** is used..
169e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
169f0 6f 64 65 52 68 73 4f 66 49 4e 28 0a 20 20 50 61  odeRhsOfIN(.  Pa
16a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16a10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16a20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16a30 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
16a50 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
16a60 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
16a70 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
16a80 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  s cursor number 
16a90 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ab0 49 66 20 74 72 75 65 2c 20 4c 48 53 20 69 73 20  If true, LHS is 
16ac0 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
16ad0 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
16ae0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
16af0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
16b00 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
16b10 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e  n at top */.  in
16b20 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
16b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16b40 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
16b50 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
16b60 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
16b70 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
16b80 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48 53        /* the LHS
16b90 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16ba0 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  tor */.  KeyInfo
16bb0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
16bc0 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
16bd0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
16be0 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
16bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16c00 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
16c10 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
16c40 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
16c50 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
16c60 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  /..  v = pParse-
16c70 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
16c80 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
16c90 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
16ca0 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62 65  f the IN must be
16cb0 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
16cc0 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
16cd0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
16ce0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
16cf0 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
16d00 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
16d10 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16d20 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
16d30 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
16d40 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
16d50 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
16d60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
16d70 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
16d80 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
16d90 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
16da0 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
16db0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
16dc0 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
16dd0 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70  then we can comp
16de0 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73 74  ute the RHS just
16df0 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72   once.  ** and r
16e00 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d  euse it many nam
16e10 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
16e20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16e30 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
16e40 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d 3e  ect) && pParse->
16e50 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20  iSelfTab==0 ){. 
16e60 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20 74     /* Reuse of t
16e70 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77 65  he RHS is allowe
16e80 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  d */.    /* If t
16e90 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
16ea0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
16eb0 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65 76  ed, but the prev
16ec0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a  ious code.    **
16ed0 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
16ee0 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74  been invoked yet
16ef0 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e  , so invoke it n
16f00 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  ow as a subrouti
16f10 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ne. .    */.    
16f20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16f30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
16f40 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  brtn) ){.      s
16f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16f60 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20  (v, OP_Once, 0, 
16f70 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16f80 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
16f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16fa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
16fb0 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  b, pExpr->y.sub.
16fc0 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20  regReturn,.     
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
16ff0 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71  iAddr);.      sq
17000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17010 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69  v, OP_OpenDup, i
17020 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Tab, pExpr->iTab
17030 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
17040 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  n;.    }..    /*
17050 20 42 65 67 69 6e 20 63 6f 64 69 6e 67 20 74 68   Begin coding th
17060 65 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  e subroutine */.
17070 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
17080 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
17090 62 72 74 6e 29 3b 0a 20 20 20 20 70 45 78 70 72  brtn);.    pExpr
170a0 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
170b0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
170c0 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79  em;.    pExpr->y
170d0 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a 20 20 20  .sub.iAddr =.   
170e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17100 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79 2e  er, 0, pExpr->y.
17110 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20 2b  sub.regReturn) +
17120 20 31 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d   1;.    VdbeComm
17130 65 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e 20  ent((v, "return 
17140 61 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20 20  address"));..   
17150 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
17160 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
17170 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
17180 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
17190 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
171a0 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
171b0 76 65 63 74 6f 72 20 49 4e 20 6f 70 65 72 61 74  vector IN operat
171c0 6f 72 20 2a 2f 0a 20 20 70 4c 65 66 74 20 3d 20  or */.  pLeft = 
171d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
171e0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
171f0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
17200 66 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ft);.  assert( !
17210 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d  isRowid || nVal=
17220 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  =1 );..  /* Cons
17230 74 72 75 63 74 20 74 68 65 20 65 70 68 65 6d 65  truct the epheme
17240 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 77  ral table that w
17250 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
17260 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  content of.  ** 
17270 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
17280 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70  erator..  */.  p
17290 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
172a0 54 61 62 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  Tab;.  addr = sq
172b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
172c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
172d0 72 61 6c 2c 20 0a 20 20 20 20 20 20 70 45 78 70  ral, .      pExp
172e0 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f  r->iTable, (isRo
172f0 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 23 69  wid?0:nVal));.#i
17300 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17310 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
17320 4e 54 53 0a 20 20 69 66 28 20 45 78 70 72 48 61  NTS.  if( ExprHa
17330 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17340 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17350 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  {.    VdbeCommen
17360 74 28 28 76 2c 20 22 52 65 73 75 6c 74 20 6f 66  t((v, "Result of
17370 20 53 45 4c 45 43 54 20 25 75 22 2c 20 70 45 78   SELECT %u", pEx
17380 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
17390 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  elId));.  }else{
173a0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
173b0 28 28 76 2c 20 22 52 48 53 20 6f 66 20 49 4e 20  ((v, "RHS of IN 
173c0 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d  operator"));.  }
173d0 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e  .#endif.  pKeyIn
173e0 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30  fo = isRowid ? 0
173f0 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   : sqlite3KeyInf
17400 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
17410 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20  b, nVal, 1);..  
17420 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
17430 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17440 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
17450 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
17460 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17470 2e 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ..).    **.    *
17480 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17490 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
174a0 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
174b0 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
174c0 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
174d0 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
174e0 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
174f0 20 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74     */.    Select
17500 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
17510 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
17520 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
17530 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
17540 4c 69 73 74 3b 0a 0a 20 20 20 20 45 78 70 6c 61  List;..    Expla
17550 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
17560 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20  rse, 1, "%sLIST 
17570 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20  SUBQUERY %d",.  
17580 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 3f 22        addrOnce?"
17590 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
175a0 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 0a   pSelect->selId.
175b0 20 20 20 20 29 29 3b 0a 20 20 20 20 61 73 73 65      ));.    asse
175c0 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
175d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
175e0 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
175f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
17600 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
17610 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c      ** error wil
17620 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67  l have been caug
17630 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77  ht long before w
17640 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
17650 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 41  nt. */.    if( A
17660 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
17670 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
17680 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
17690 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  est;.      int i
176a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
176b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
176c0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
176d0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
176e0 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
176f0 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
17700 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
17710 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63 74  );.      pSelect
17720 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
17730 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
17740 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
17750 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  & SF_Distinct );
17760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17770 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
17780 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
17790 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
177a0 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
177b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
177c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
177d0 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
177e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
177f0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
17800 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
17810 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17820 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
17830 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
17840 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
17850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
17860 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
17870 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
17880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17890 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a  KeyInfo!=0 ); /*
178a0 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
178b0 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74  exit after sqlit
178c0 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e3Select() */.  
178d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
178e0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  st!=0 );.      a
178f0 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
17900 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
17910 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
17920 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
17930 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
17940 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17950 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
17960 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
17970 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
17980 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
17990 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  );.        pKeyI
179a0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
179b0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
179c0 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20  pareCollSeq(.   
179d0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
179e0 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
179f0 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  .pExpr.        )
17a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17a10 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17a20 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
17a30 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20  t!=0) ){.    /* 
17a40 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
17a50 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
17a60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
17a70 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17a80 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  , build an index
17a90 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76   key from the ev
17aa0 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  aluation and.   
17ab0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
17ac0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17ad0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
17ae0 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
17af0 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74   use.    ** that
17b00 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
17b10 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
17b20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
17b30 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
17b40 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
17b50 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
17b60 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ty..    */.    c
17b70 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
17b80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
17b90 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
17ba0 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
17bb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
17bc0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
17bd0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17be0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17bf0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17c00 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
17c10 33 3b 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20  3;.    affinity 
17c20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
17c30 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
17c40 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
17c50 29 7b 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  ){.      affinit
17c60 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
17c70 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LOB;.    }.    i
17c80 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
17c90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
17ca0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
17cb0 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
17cc0 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e   );.      pKeyIn
17cd0 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
17ce0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17cf0 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
17d00 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 0a  >pLeft);.    }..
17d10 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
17d20 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
17d30 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
17d40 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73  >. */.    r1 = s
17d50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17d60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
17d70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17d80 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17d90 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
17da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17db0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  4(v, OP_Blob, 0,
17dc0 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53   r2, 0, "", P4_S
17dd0 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28  TATIC);.    for(
17de0 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
17df0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
17e00 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
17e10 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
17e20 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
17e30 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 56  pr;.      int iV
17e40 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
17e50 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
17e60 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
17e70 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
17e80 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
17e90 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
17ea0 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
17eb0 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
17ec0 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
17ed0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
17ee0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
17ef0 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
17f00 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
17f10 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
17f20 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
17f30 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
17f40 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
17f50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  */.      if( add
17f60 72 4f 6e 63 65 20 26 26 20 21 73 71 6c 69 74 65  rOnce && !sqlite
17f70 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
17f80 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
17f90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17fa0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f  eToNoop(v, addrO
17fb0 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20 61 64  nce);.        ad
17fc0 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20  drOnce = 0;.    
17fd0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
17fe0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
17ff0 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
18000 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
18010 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
18020 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
18030 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
18040 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
18050 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
18060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18070 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
18080 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
18090 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
180a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
180b0 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
180c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
180d0 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
180e0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r1);.        if(
180f0 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
18100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18110 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
18120 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18150 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18160 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
18170 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18180 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18190 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
181a0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
181b0 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
181c0 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  3);.        }els
181d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
181e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
181f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
18200 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
18210 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
18220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18230 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
18240 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
18250 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
18260 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
18270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18280 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18290 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
182a0 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
182b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
182c0 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a  Parse, r2);.  }.
182d0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
182e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
182f0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
18300 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
18310 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
18320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72  ;.  }.  if( addr
18330 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Once ){.    sqli
18340 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18350 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20  v, addrOnce);.  
18360 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
18370 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71  return */.    sq
18380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18390 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45  v, OP_Return, pE
183a0 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
183b0 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  turn);.    sqlit
183c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
183d0 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69  , pExpr->y.sub.i
183e0 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56  Addr-1, sqlite3V
183f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18400 29 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  )-1);.  }.}.#end
18410 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18420 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
18430 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
18440 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
18450 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
18460 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
18470 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72 20 45 58 49  ession.** or EXI
18480 53 54 53 20 6f 70 65 72 61 74 6f 72 3a 0a 2a 2a  STS operator:.**
18490 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
184a0 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
184b0 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
184c0 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
184d0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
184e0 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
184f0 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ery.**.** The pE
18500 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
18510 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 45   the SELECT or E
18520 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 74  XISTS operator t
18530 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a  o be coded..**.*
18540 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 20 74  * The register t
18550 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 72 65  hat holds the re
18560 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c  sult.  For a mul
18570 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54  ti-column SELECT
18580 2c 20 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  , .** the result
18590 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
185a0 63 6f 6e 74 69 67 75 6f 75 73 20 61 72 72 61 79  contiguous array
185b0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
185c0 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  d the.** return 
185d0 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67  value is the reg
185e0 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66  ister of the lef
185f0 74 2d 6d 6f 73 74 20 72 65 73 75 6c 74 20 63 6f  t-most result co
18600 6c 75 6d 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  lumn..** Return 
18610 30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  0 if an error oc
18620 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
18630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18640 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
18650 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
18660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18670 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
18680 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20  t addrOnce = 0; 
18690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
186a0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  ress of OP_Once 
186b0 61 74 20 74 6f 70 20 6f 66 20 73 75 62 72 6f 75  at top of subrou
186c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 52  tine */.  int rR
186d0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
186e0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
186f0 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
18700 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ing */.  Select 
18710 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
18720 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
18730 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
18740 64 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  de */.  SelectDe
18750 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
18760 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
18770 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
18780 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  esult */.  int n
18790 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
187a0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
187b0 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
187c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
187d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
187e0 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78   /* New limit ex
187f0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 56  pression */..  V
18800 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
18810 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
18820 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
18830 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
18840 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18850 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76   coded, then inv
18860 6f 6b 65 20 69 74 20 61 73 20 61 20 73 75 62 72  oke it as a subr
18870 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 28  outine. */.  if(
18880 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18890 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74  (pExpr, EP_Subrt
188a0 6e 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  n) ){.    sqlite
188b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
188c0 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e  P_Gosub, pExpr->
188d0 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c  y.sub.regReturn,
188e0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
188f0 64 64 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ddr);.    return
18900 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
18910 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
18920 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  coding the subro
18930 75 74 69 6e 65 20 2a 2f 0a 20 20 45 78 70 72 53  utine */.  ExprS
18940 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
18950 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
18960 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18970 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
18980 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 70 45 78 70 72  e->nMem;.  pExpr
18990 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d 0a  ->y.sub.iAddr =.
189a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
189b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
189c0 67 65 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 79  ger, 0, pExpr->y
189d0 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 20  .sub.regReturn) 
189e0 2b 20 31 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  + 1;.  VdbeComme
189f0 6e 74 28 28 76 2c 20 22 72 65 74 75 72 6e 20 61  nt((v, "return a
18a00 64 64 72 65 73 73 22 29 29 3b 0a 0a 20 20 2f 2a  ddress"));..  /*
18a10 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
18a20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53  of the IN/EXISTS
18a30 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
18a40 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
18a50 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
18a60 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
18a70 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
18a80 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
18a90 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
18aa0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
18ab0 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
18ac0 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
18ad0 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
18ae0 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
18af0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
18b00 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
18b10 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
18b20 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
18b30 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
18b40 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
18b50 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
18b60 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
18b70 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
18b80 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
18b90 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
18ba0 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
18bb0 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
18bc0 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
18bd0 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
18be0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18bf0 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
18c00 29 7b 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20  ){.    addrOnce 
18c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18c20 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
18c30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18c40 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f  ;.  }.  .  /* Fo
18c50 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
18c60 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
18c70 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
18c80 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
18c90 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f   ** the first ro
18ca0 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  w into an array 
18cb0 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
18cc0 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   return the inde
18cd0 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69  x of.  ** the fi
18ce0 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20  rst register..  
18cf0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
18d00 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
18d10 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
18d20 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
18d30 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a 2a   1 (exists).  **
18d40 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18d50 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
18d60 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
18d70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62  ..  **.  ** In b
18d80 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
18d90 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
18da0 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
18db0 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65  .  Any .  ** pre
18dc0 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
18dd0 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
18de0 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
18df0 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20  LIMIT 1..  */.  
18e00 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
18e10 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
18e20 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
18e30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18e40 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
18e50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18e60 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
18e70 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18e80 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
18e90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18ea0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18eb0 3b 0a 0a 20 20 70 53 65 6c 20 3d 20 70 45 78 70  ;..  pSel = pExp
18ec0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
18ed0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18ee0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
18ef0 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 22  SCALAR SUBQUERY"
18f00 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e  ,.        addrOn
18f10 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  ce?"":"CORRELATE
18f20 44 20 22 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20  D "));.  nReg = 
18f30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
18f40 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c  LECT ? pSel->pEL
18f50 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a  ist->nExpr : 1;.
18f60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18f70 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
18f80 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  , pParse->nMem+1
18f90 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
18fa0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28  m += nReg;.  if(
18fb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18fc0 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65 73  ELECT ){.    des
18fd0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
18fe0 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73  m;.    dest.iSds
18ff0 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  t = dest.iSDParm
19000 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74  ;.    dest.nSdst
19010 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c   = nReg;.    sql
19020 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19030 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
19040 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
19050 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
19060 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19070 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
19080 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
19090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
190a0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
190b0 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  ists;.    sqlite
190c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
190d0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
190e0 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
190f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19100 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
19110 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70  sult"));.  }.  p
19120 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
19130 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
19140 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  >db, TK_INTEGER,
19150 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
19160 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  s[1], 0);.  if( 
19170 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSel->pLimit ){.
19180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
19190 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
191a0 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
191b0 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65 6c  pLeft);.    pSel
191c0 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20  ->pLimit->pLeft 
191d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73  = pLimit;.  }els
191e0 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  e{.    pSel->pLi
191f0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
19200 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49  pr(pParse, TK_LI
19210 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b  MIT, pLimit, 0);
19220 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69  .  }.  pSel->iLi
19230 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  mit = 0;.  if( s
19240 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19250 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
19260 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
19270 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e  0;.  }.  pExpr->
19280 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d 20  iTable = rReg = 
19290 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
192a0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
192b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
192c0 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61 64  educe);.  if( ad
192d0 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71  drOnce ){.    sq
192e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
192f0 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
19300 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 62 72 6f 75    }..  /* Subrou
19310 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20  tine return */. 
19320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19330 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
19340 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
19350 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
19360 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
19370 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  v, pExpr->y.sub.
19380 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65 33  iAddr-1, sqlite3
19390 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
193a0 76 29 2d 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  v)-1);..  return
193b0 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
193c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
193d0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
193e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
193f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
19400 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
19410 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
19420 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
19430 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
19440 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
19450 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
19460 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
19470 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
19480 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
19490 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
194a0 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
194b0 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
194c0 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
194d0 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
194e0 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
194f0 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
19500 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
19510 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
19520 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19530 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
19540 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
19550 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
19560 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
19570 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
19580 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
19590 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
195a0 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
195b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
195c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
195d0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
195e0 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
195f0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
19600 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
19610 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19620 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
19630 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
19640 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
19650 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19660 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
19670 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19680 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
19690 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
196a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
196b0 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
196c0 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
196d0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
196e0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
196f0 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
19700 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
19710 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
19720 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
19730 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
19740 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
19750 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
19760 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
19770 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
19780 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
19790 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
197a0 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
197b0 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
197c0 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
197d0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
197e0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
197f0 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
19800 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
19810 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
19820 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
19830 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
19840 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
19850 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
19860 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
19870 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
19880 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
19890 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
198a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
198b0 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
198c0 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
198d0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
198e0 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
198f0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
19900 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
19910 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
19920 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
19930 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
19940 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
19950 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
19960 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19970 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
19980 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
19990 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
199a0 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
199b0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
199c0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
199d0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
199e0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
199f0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
19a00 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
19a10 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
19a20 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
19a30 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
19a40 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
19a50 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
19a60 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
19a70 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
19a80 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
19a90 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
19aa0 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
19ab0 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
19ac0 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
19ad0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19ae0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
19af0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
19b00 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
19b10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19b20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
19b30 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19b40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
19b50 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19b60 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
19b70 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
19b80 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
19b90 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19ba0 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
19bb0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
19bc0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
19bd0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
19be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
19bf0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
19c00 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
19c10 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
19c20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
19c30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
19c40 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
19c50 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
19c60 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
19c70 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
19c80 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
19c90 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
19ca0 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
19cb0 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
19cc0 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
19cd0 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
19ce0 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
19cf0 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
19d00 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
19d10 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
19d20 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
19d30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
19d40 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
19d50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
19d60 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
19d70 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
19d80 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
19d90 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
19da0 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
19db0 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
19dc0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
19dd0 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
19de0 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
19df0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19e00 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
19e10 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
19e20 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
19e30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
19e40 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
19e50 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
19e60 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
19e70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
19e80 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
19e90 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
19ea0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
19eb0 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
19ec0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
19ed0 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
19ee0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19ef0 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
19f00 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
19f10 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
19f20 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
19f30 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
19f40 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
19f50 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
19f60 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
19f70 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
19f80 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
19f90 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
19fa0 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
19fb0 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
19fc0 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
19fd0 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
19fe0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
19ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
1a000 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
1a010 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69 54 61  op */ .  int iTa
1a020 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  b = 0;         /
1a030 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  * Index to use *
1a040 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78  /..  pLeft = pEx
1a050 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28  pr->pLeft;.  if(
1a060 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
1a070 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  kIN(pParse, pExp
1a080 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  r) ) return;.  z
1a090 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69  Aff = exprINAffi
1a0a0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
1a0b0 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d  pr);.  nVector =
1a0c0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1a0d0 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
1a0e0 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20  eft);.  aiMap = 
1a0f0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d  (int*)sqlite3DbM
1a100 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20  allocZero(.     
1a110 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65   pParse->db, nVe
1a120 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74  ctor*(sizeof(int
1a130 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29  ) + sizeof(char)
1a140 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28  ) + 1.  );.  if(
1a150 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a160 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
1a170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a180 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20  IN_oom_error;.. 
1a190 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63   /* Attempt to c
1a1a0 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
1a1b0 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
1a1c0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   if anything oth
1a1d0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f  er than.  ** IN_
1a1e0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
1a1f0 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c  turned, the tabl
1a200 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 63 75  e opened with cu
1a210 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a 20 63  rsor iTab.  ** c
1a220 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
1a230 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
1a240 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
1a250 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
1a260 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
1a270 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
1a280 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
1a290 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1a2a0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
1a2b0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
1a2c0 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
1a2d0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
1a2e0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
1a2f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
1a300 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
1a310 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
1a320 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
1a330 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
1a360 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
1a370 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
1a3a0 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1a3b0 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
1a3c0 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20 20 20  HasNull,.       
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26 69 54        aiMap, &iT
1a3f0 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ab);..  assert( 
1a400 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1a410 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
1a420 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
1a430 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
1a440 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
1a450 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
1a460 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
1a470 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
1a480 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a490 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
1a4a0 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
1a4b0 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
1a4c0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1a4d0 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
1a4e0 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
1a4f0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1a500 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
1a510 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
1a520 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
1a530 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
1a540 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
1a550 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
1a560 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
1a570 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
1a580 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
1a590 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
1a5a0 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
1a5b0 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
1a5c0 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
1a5d0 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
1a5e0 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
1a5f0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1a600 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
1a610 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
1a620 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
1a630 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
1a640 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
1a650 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
1a660 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
1a670 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
1a680 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
1a690 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
1a6a0 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
1a6b0 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
1a6c0 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
1a6d0 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
1a6e0 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
1a6f0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
1a700 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
1a710 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
1a720 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c 68 73  dex..  */.  rLhs
1a730 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
1a740 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
1a750 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
1a760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1a770 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
1a780 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
1a790 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
1a7a0 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
1a7b0 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
1a7c0 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
1a7d0 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
1a7e0 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
1a7f0 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
1a800 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
1a810 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
1a820 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
1a830 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
1a840 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
1a850 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1a860 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
1a870 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a880 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1a890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a8a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
1a8b0 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
1a8c0 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
1a8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a8e0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
1a8f0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
1a900 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
1a910 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
1a920 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
1a930 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
1a940 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
1a950 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
1a960 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
1a970 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
1a980 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
1a990 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
1a9a0 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
1a9b0 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
1a9c0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
1a9d0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1a9e0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
1a9f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1aa00 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1aa10 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
1aa20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1aa30 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1aa40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
1aa50 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
1aa60 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
1aa70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1aa80 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
1aa90 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
1aaa0 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
1aab0 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
1aac0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1aad0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1aae0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1aaf0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
1ab00 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1ab10 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
1ab20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ab30 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1ab40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ab50 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
1ab60 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
1ab70 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
1ab80 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1ab90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1aba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
1abb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1abc0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
1abd0 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
1abe0 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
1abf0 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
1ac00 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
1ac10 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
1ac20 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
1ac30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ac40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ac50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
1ac60 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
1ac70 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1ac80 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
1ac90 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
1aca0 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
1acb0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
1acc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1acd0 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
1ace0 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
1ad10 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1ad20 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1ad30 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
1ad40 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
1ad50 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1ad60 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
1ad70 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
1ad80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ad90 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1ada0 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
1adb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
1adc0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
1add0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
1ade0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1adf0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ae00 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
1ae10 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1ae40 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
1ae50 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ae60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1ae80 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
1ae90 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1aea0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1aeb0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1aec0 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
1aed0 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
1aee0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
1aef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1af00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1af10 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
1af20 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
1af30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1af40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1af50 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
1af60 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
1af70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1af80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1af90 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
1afa0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1afb0 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
1afc0 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
1afd0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
1afe0 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
1aff0 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
1b000 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
1b010 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
1b020 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
1b030 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
1b040 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
1b050 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
1b060 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
1b070 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
1b080 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
1b090 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
1b0a0 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
1b0b0 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
1b0c0 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
1b0d0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
1b0e0 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
1b0f0 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
1b100 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
1b110 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
1b120 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b130 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  l(v);.  }.  for(
1b140 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1b150 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1b160 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
1b170 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
1b180 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
1b190 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1b1a0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
1b1b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b1c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b1d0 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
1b1e0 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
1b1f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b200 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
1b210 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
1b220 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
1b230 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1b240 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
1b250 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
1b260 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
1b270 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
1b280 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
1b290 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
1b2a0 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
1b2b0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1b2c0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
1b2d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1b2e0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
1b2f0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
1b300 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
1b310 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
1b320 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
1b330 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
1b340 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
1b350 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
1b360 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1b370 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
1b380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b390 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
1b3a0 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1b3b0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56  se, rLhs);.    V
1b3c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b3d0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1b3e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b3f0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
1b400 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65    /* Return True
1b410 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1b420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b430 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
1b440 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72  y, rLhs, nVector
1b450 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
1b460 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  or);.    if( des
1b470 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1b480 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
1b490 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20   Combine Step 3 
1b4a0 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20  and Step 5 into 
1b4b0 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20  a single opcode 
1b4c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1b4d0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1b4e0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54   OP_NotFound, iT
1b4f0 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  ab, destIfFalse,
1b500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b510 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1b520 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1b530 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b540 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1b550 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1b560 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1b570 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1b580 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1b590 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1b5a0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1b5b0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1b5c0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1b5d0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1b5e0 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c  _Found, iTab, 0,
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
1b620 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
1b630 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1b640 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68  * Step 4.  If th
1b650 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74  e RHS is known t
1b660 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e  o be non-NULL an
1b670 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e  d we did not fin
1b680 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20  d.  ** an match 
1b690 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62  on the search ab
1b6a0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1b6b0 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c  sult must be FAL
1b6c0 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  SE..  */.  if( r
1b6d0 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56  RhsHasNull && nV
1b6e0 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20  ector==1 ){.    
1b6f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b700 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
1b710 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
1b720 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1b730 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b740 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1b750 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
1b760 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1b770 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1b780 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a  en NULL and.  **
1b790 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73   FALSE, then jus
1b7a0 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  t return false. 
1b7b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1b7c0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1b7d0 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ull ) sqlite3Vdb
1b7e0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
1b7f0 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65  alse);..  /* Ste
1b800 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  p 6: Loop throug
1b810 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48  h rows of the RH
1b820 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68  S.  Compare each
1b830 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e   row to the LHS.
1b840 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d  .  ** If any com
1b850 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c  parison is NULL,
1b860 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1b870 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c   is NULL.  If al
1b880 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  l.  ** compariso
1b890 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65  ns are FALSE the
1b8a0 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  n the final resu
1b8b0 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a  lt is FALSE..  *
1b8c0 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61  *.  ** For a sca
1b8d0 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73  lar LHS, it is s
1b8e0 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65  ufficient to che
1b8f0 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ck just the firs
1b900 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68  t row.  ** of th
1b910 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
1b920 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71  ( destStep6 ) sq
1b930 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b940 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65  Label(v, destSte
1b950 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d  p6);.  addrTop =
1b960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b970 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
1b980 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1b990 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
1b9a0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
1b9b0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
1b9c0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
1b9d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b9e0 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
1b9f0 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
1ba00 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
1ba10 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
1ba20 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
1ba30 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
1ba40 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
1ba50 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1ba60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
1ba70 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
1ba80 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
1ba90 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1baa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1bab0 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
1bac0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
1bad0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
1bae0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1baf0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1bb00 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
1bb10 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
1bb20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1bb30 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1bb40 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
1bb50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1bb60 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
1bb70 62 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73  b, i, r3);.    s
1bb80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bb90 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b  (v, OP_Ne, rLhs+
1bba0 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20  i, destNotNull, 
1bbb0 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
1bbc0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1bbd0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1bbe0 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  EQ);.    VdbeCov
1bbf0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1bc00 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1bc10 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
1bc20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1bc30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1bc40 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
1bc50 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  ll);.  if( nVect
1bc60 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  or>1 ){.    sqli
1bc70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1bc80 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75  bel(v, destNotNu
1bc90 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1bca0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bcb0 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
1bcc0 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62  rTop+1);.    Vdb
1bcd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1bce0 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49     /* Step 7:  I
1bcf0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1bd00 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
1bd10 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hat the result m
1bd20 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61  ust.    ** be fa
1bd30 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lse. */.    sqli
1bd40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bd50 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1bd60 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a  tIfFalse);.  }..
1bd70 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20    /* Jumps here 
1bd80 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75  in order to retu
1bd90 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71  rn true. */.  sq
1bda0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1bdb0 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70  e(v, addrTruthOp
1bdc0 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43  );..sqlite3ExprC
1bdd0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a  odeIN_finished:.
1bde0 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73    if( rLhs!=rLhs
1bdf0 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65  Orig ) sqlite3Re
1be00 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1be10 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64  rse, rLhs);.  Vd
1be20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
1be30 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73  nd IN expr"));.s
1be40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1be50 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71  _oom_error:.  sq
1be60 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1be70 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
1be80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1be90 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
1bea0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
1beb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bec0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
1bed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1bee0 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
1bef0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1bf00 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1bf10 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
1bf20 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
1bf30 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
1bf40 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1bf50 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1bf60 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
1bf70 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
1bf80 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
1bf90 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
1bfa0 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
1bfb0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
1bfc0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
1bfd0 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
1bfe0 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
1bff0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
1c000 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
1c010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1c020 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
1c030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1c040 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
1c050 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
1c060 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
1c070 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
1c080 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
1c090 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
1c0a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
1c0b0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
1c0c0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
1c0d0 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
1c0e0 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
1c0f0 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
1c100 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
1c110 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
1c120 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
1c130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c140 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
1c150 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
1c160 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
1c170 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
1c180 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
1c190 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
1c1a0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
1c1b0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
1c1c0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
1c1d0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1c1e0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1c1f0 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
1c200 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
1c210 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
1c220 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
1c230 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
1c240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c250 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1c260 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
1c270 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
1c280 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c290 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1c2a0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
1c2b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
1c2c0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
1c2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
1c2e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
1c2f0 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
1c300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c310 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1c320 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
1c330 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
1c340 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
1c350 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1c360 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
1c370 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
1c380 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
1c390 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
1c3a0 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
1c3b0 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33  );.    if( (c==3
1c3c0 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c   && !negFlag) ||
1c3d0 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46   (c==2) || (negF
1c3e0 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d  lag && value==SM
1c3f0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a  ALLEST_INT64)){.
1c400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1c410 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1c420 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
1c430 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c440 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
1c450 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
1c460 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
1c470 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
1c480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
1c490 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
1c4a0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
1c4b0 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
1c4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c4d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c4e0 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
1c4f0 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c   too big: %s%s",
1c500 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c   negFlag?"-":"",
1c510 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  z);.      }else.
1c520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1c530 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1c540 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
1c550 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Mem);.      }.#e
1c560 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1c570 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
1c580 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
1c590 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  3 ? SMALLEST_INT
1c5a0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
1c5b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c5c0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
1c5d0 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
1c5e0 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1c5f0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
1c600 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e  }.  }.}.../* Gen
1c610 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1c620 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
1c630 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
1c640 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1c650 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1c660 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
1c670 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
1c680 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
1c690 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
1c6a0 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
1c6b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c6c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1c6d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1c6e0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
1c6f0 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
1c700 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
1c710 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c720 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
1c730 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1c740 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
1c750 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
1c760 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1c770 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
1c780 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1c790 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1c7a0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
1c7b0 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
1c7c0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1c7d0 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
1c7e0 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
1c7f0 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
1c800 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
1c810 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
1c820 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1c830 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
1c840 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1c850 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
1c860 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
1c870 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
1c880 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c  Cur + 1;.    sql
1c890 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1c8a0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
1c8b0 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
1c8c0 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
1c8d0 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  t);.    pParse->
1c8e0 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
1c8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1c900 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c910 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
1c920 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
1c930 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
1c940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
1c970 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1c980 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c990 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
1c9a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
1c9b0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1c9c0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
1c9d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c9e0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1c9f0 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1ca00 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1ca10 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1ca20 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
1ca30 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
1ca40 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1ca50 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
1ca60 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1ca70 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
1ca80 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
1ca90 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
1caa0 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
1cab0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
1cac0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
1cad0 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
1cae0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1caf0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1cb00 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
1cb10 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1cb20 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  {.  if( pTab==0 
1cb30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1cb40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1cb50 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20  olumn, iTabCur, 
1cb60 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1cb70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1cb80 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1cb90 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1cba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1cbb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cbc0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1cbd0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1cbe0 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1cbf0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1cc00 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1cc10 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1cc20 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1cc30 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1cc40 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1cc50 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1cc60 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1cc70 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1cc80 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1cc90 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1cca0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1ccb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1ccc0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1ccd0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1cce0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1ccf0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1cd00 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1cd10 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1cd20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1cd30 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1cd40 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1cd50 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1cd60 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1cd70 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1cd80 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1cd90 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a  register iReg. .
1cda0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
1cdb0 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
1cdc0 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
1cdd0 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
1cde0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
1cdf0 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
1ce00 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
1ce10 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
1ce20 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
1ce30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1ce40 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1ce50 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1ce60 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
1ce70 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
1ce80 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
1ce90 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1cea0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
1ceb0 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
1cec0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
1ced0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
1cee0 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
1cef0 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
1cf00 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1cf10 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
1cf20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
1cf30 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
1cf40 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
1cf50 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
1cf60 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1cf70 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
1cf80 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
1cf90 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46  or OP_Column + F
1cfa0 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  LAGS */.){.  Vdb
1cfb0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1cfc0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1cfd0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1cfe0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1cff0 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1d000 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1d010 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1d020 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1d030 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1d040 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , p5);.  }.  ret
1d050 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
1d060 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d070 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1d080 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1d090 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1d0a0 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1d0b0 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1d0c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d0d0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
1d0e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d0f0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
1d100 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
1d110 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
1d120 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
1d130 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
1d140 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1d150 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1d160 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
1d170 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a  o, nReg);.}../*.
1d180 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61  ** Convert a sca
1d190 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  lar expression n
1d1a0 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
1d1b0 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67  STER referencing
1d1c0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65  .** register iRe
1d1d0 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  g.  The caller m
1d1e0 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
1d1f0 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e  iReg already con
1d200 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72  tains.** the cor
1d210 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1d220 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
1d230 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1d240 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
1d250 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
1d260 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
1d270 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
1d280 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
1d290 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
1d2a0 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
1d2b0 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
1d2c0 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  ../*.** Evaluate
1d2d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28   an expression (
1d2e0 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
1d2f0 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  or a scalar expr
1d300 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72  ession) and stor
1d310 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
1d320 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74  in continguous t
1d330 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1d340 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  rs.  Return the 
1d350 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
1d360 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75  first register u
1d370 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1d380 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
1d390 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d3a0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1d3b0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63  s a temporary sc
1d3c0 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20  alar, then also 
1d3d0 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65  write.** that re
1d3e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e  gister number in
1d3f0 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20  to *piFreeable. 
1d400 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
1d410 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1d420 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  .** is not a tem
1d430 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65  porary or if the
1d440 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1d450 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46   vector set *piF
1d460 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e  reeable.** to 0.
1d470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1d480 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61  xprCodeVector(Pa
1d490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1d4a0 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65  r *p, int *piFre
1d4b0 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  eable){.  int iR
1d4c0 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65  esult;.  int nRe
1d4d0 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1d4e0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b  prVectorSize(p);
1d4f0 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d  .  if( nResult==
1d500 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74  1 ){.    iResult
1d510 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d520 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1d530 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20  , piFreeable);. 
1d540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46   }else{.    *piF
1d550 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  reeable = 0;.   
1d560 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
1d570 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c  ELECT ){.#if SQL
1d580 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d590 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  Y.      iResult 
1d5a0 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  = 0;.#else.     
1d5b0 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1d5c0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1d5d0 70 50 61 72 73 65 2c 20 70 29 3b 0a 23 65 6e 64  pParse, p);.#end
1d5e0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1d5f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1d600 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1d610 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1d620 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1d630 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1d640 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1d650 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1d660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d670 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1d680 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1d690 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1d6a0 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1d6b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d6c0 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1d6d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d6e0 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1d6f0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1d700 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1d710 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1d720 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1d730 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1d740 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1d750 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1d760 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1d770 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1d780 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1d790 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1d7a0 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1d7b0 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1d7c0 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1d7d0 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1d7e0 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1d7f0 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1d800 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1d810 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1d820 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1d830 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1d840 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1d850 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1d860 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1d870 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1d880 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1d890 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1d8a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1d8b0 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1d8c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1d8d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1d8e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d8f0 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1d900 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1d910 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1d920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d930 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1d940 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1d950 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1d960 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1d970 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1d980 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1d990 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1d9a0 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1d9b0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1d9c0 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1d9d0 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1d9e0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1d9f0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1da00 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1da10 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1da20 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1da30 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1da40 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1da50 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1da60 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1da70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1da80 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1da90 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1daa0 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1dab0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1dac0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1dad0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1dae0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1daf0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1db00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1db10 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1db20 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65  ;.  }..expr_code
1db30 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70  _doover:.  if( p
1db40 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1db50 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1db60 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1db70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1db80 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1db90 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1dba0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1dbb0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1dbc0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1dbd0 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1dbe0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1dbf0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1dc00 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1dc10 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1dc20 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1dc30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1dc40 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1dc50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1dc60 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1dc70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dc80 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1dc90 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1dca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dcb0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1dcc0 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1dcd0 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1dd00 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1dd10 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1dd20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1dd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1dd40 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1dd50 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1dd60 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1dd70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dd80 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1dd90 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1dda0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1ddb0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ddc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ddd0 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
1dde0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f        /* This CO
1ddf0 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
1de00 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73  is really a cons
1de10 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52  tant due to WHER
1de20 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  E clause.       
1de30 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   ** constraints,
1de40 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61   and that consta
1de50 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74  nt is coded by t
1de60 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  he pExpr->pLeft.
1de70 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
1de80 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72  sssion.  However
1de90 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1dea0 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65  constant has the
1deb0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20   correct.       
1dec0 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20   ** datatype by 
1ded0 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66  applying the Aff
1dee0 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62  inity of the tab
1def0 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  le column to the
1df00 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1df10 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tant..        */
1df20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65  .        int iRe
1df30 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1df40 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1df50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74  , pExpr->pLeft,t
1df60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1df70 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65  int aff = sqlite
1df80 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
1df90 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
1dfa0 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
1dfb0 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
1dfc0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
1dfd0 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
1dfe0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1dff0 63 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42  char zAff[] = "B
1e000 5c 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22  \000C\000D\000E"
1e010 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e020 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  rt( SQLITE_AFF_B
1e030 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20  LOB=='A' );.    
1e040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1e050 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27  LITE_AFF_TEXT=='
1e060 42 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  B' );.          
1e070 69 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74  if( iReg!=target
1e080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e0a0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1e0b0 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1e0c0 20 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d            iReg =
1e0d0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20   target;.       
1e0e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
1e0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e100 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1e110 20 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20   iReg, 1, 0,.   
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28           &zAff[(
1e140 61 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f  aff-'B')*2], P4_
1e150 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
1e160 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
1e170 6e 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  n iReg;.      }.
1e180 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1e190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e1a0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e1b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1e1c0 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1e1d0 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1e1e0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1e1f0 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1e200 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1e210 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1e220 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65  mn - pParse->iSe
1e230 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1e240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e250 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1e260 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1e270 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1e280 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1e290 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1e2a0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1e2b0 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1e2c0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1e2d0 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1e2e0 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1e2f0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e300 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
1e310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e320 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1e330 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1e340 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 79 2e 70  arse, pExpr->y.p
1e350 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1e380 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1e390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1e3c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e3d0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1e3e0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1e3f0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1e400 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e410 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e420 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
1e430 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  RUEFALSE: {.    
1e440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e450 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e460 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  r, sqlite3ExprTr
1e470 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c  uthValue(pExpr),
1e480 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e490 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e4a0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e4b0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1e4c0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1e4d0 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1e4e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e4f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e500 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e510 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1e520 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1e530 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1e540 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e550 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e560 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e570 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1e580 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e590 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e5a0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e5c0 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
1e5d0 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e  arget, pExpr->u.
1e5e0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72  zToken);.      r
1e5f0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e600 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e610 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1e620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e630 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1e640 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1e650 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e660 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e670 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
1e680 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
1e690 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
1e6a0 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
1e6b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
1e6c0 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
1e6d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1e6e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e6f0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1e700 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e710 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e720 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
1e730 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e740 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
1e750 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e760 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
1e770 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
1e780 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
1e790 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1e7a0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
1e7b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e7c0 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
1e7d0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
1e7e0 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
1e7f0 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
1e800 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
1e810 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e820 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
1e830 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
1e840 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1e850 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e860 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1e870 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1e880 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1e890 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e8a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e8b0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e8c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e8d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1e8e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e8f0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e900 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1e910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e920 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1e930 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e940 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e950 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1e960 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1e970 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e980 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  *z = sqlite3VLis
1e990 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73  tNumToName(pPars
1e9a0 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72  e->pVList, pExpr
1e9b0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1e9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e9d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e9e0 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45  '?' || strcmp(pE
1e9f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a  xpr->u.zToken, z
1ea00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ea10 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30  pParse->pVList[0
1ea20 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61  ] = 0; /* Indica
1ea30 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20  te VList may no 
1ea40 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67  longer be enlarg
1ea50 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1ea60 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1ea70 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50  4(v, (char*)z, P
1ea80 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1ea90 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1eaa0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1eab0 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1eac0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
1ead0 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  rn pExpr->iTable
1eae0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1eaf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1eb00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1eb10 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1eb20 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1eb30 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1eb40 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1eb50 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1eb60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1eb70 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1eb80 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1eb90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1eba0 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1ebb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ebc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1ebd0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1ebe0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1ebf0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1ec00 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ec10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ec20 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1ec30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ec40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ec50 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1ec60 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1ec70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ec80 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1ec90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1eca0 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1ecb0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1ecc0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1ecd0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1ece0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1ecf0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1ed00 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1ed10 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1ed20 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1ed30 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1ed40 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1ed50 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1ed60 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1ed70 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1ed80 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1ed90 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1eda0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1edb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1edc0 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1edd0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1ede0 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1edf0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1ee00 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1ee10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ee20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ee30 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ee40 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1ee50 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1ee60 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ee70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ee80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ee90 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1eea0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1eeb0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1eec0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1eed0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1eee0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1eef0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1ef00 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1ef10 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1ef20 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ef30 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1ef40 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1ef50 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1ef60 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1ef70 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ef80 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1ef90 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1efa0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1efb0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1efc0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1efd0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1efe0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1eff0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f000 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f010 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f020 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f030 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f040 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f050 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f060 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f070 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f080 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f090 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f0a0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f0b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f0c0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f0d0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f0e0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f0f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f110 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f120 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f140 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f150 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f160 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f170 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f180 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f190 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f1a0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f1b0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f1c0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f1e0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f1f0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f200 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1f210 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1f220 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f230 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1f240 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1f250 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1f260 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f270 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1f280 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f290 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f2a0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1f2b0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1f2c0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1f2d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f2e0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1f2f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1f300 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1f310 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1f320 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1f330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f340 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1f350 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1f360 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1f370 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f380 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1f390 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1f3a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f3b0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1f3c0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1f3d0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1f3e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f3f0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1f400 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f410 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1f420 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1f430 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1f440 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f450 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1f460 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1f470 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f480 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1f490 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1f4a0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1f4b0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1f4c0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1f4d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f4e0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1f4f0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1f500 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1f510 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1f520 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f530 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f540 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f550 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1f560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f570 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f580 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f590 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1f5a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f5b0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1f5c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1f5d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f5e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f5f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f600 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f610 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f620 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1f630 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1f640 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1f650 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f660 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1f670 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f680 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1f690 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1f6a0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1f6b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f6c0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f6d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f6e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1f6f0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1f700 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1f710 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1f720 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f730 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f740 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f750 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1f760 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1f770 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1f780 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1f790 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1f7a0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1f7b0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1f7c0 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1f7d0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1f7e0 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1f7f0 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1f800 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
1f810 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
1f820 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f830 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f840 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
1f850 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f860 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f870 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f880 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f890 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f8a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f8b0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
1f8c0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
1f8d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
1f8e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f8f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f910 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1f920 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1f930 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1f940 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1f950 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1f960 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f970 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1f980 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1f990 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1f9a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f9b0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1f9c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f9d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f9e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f9f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fa00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fa10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fa20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fa30 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1fa40 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1fa50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fa60 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
1fa70 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
1fa80 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
1fa90 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
1faa0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
1fab0 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
1fac0 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
1fad0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fae0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1faf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fb00 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fb10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fb20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fb30 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
1fb40 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
1fb50 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
1fb60 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
1fb70 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
1fb80 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
1fb90 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
1fba0 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
1fbb0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
1fbc0 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
1fbd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fbe0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1fbf0 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
1fc00 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
1fc10 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
1fc20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fc30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fc40 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1fc50 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1fc60 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
1fc70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fc80 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1fc90 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1fca0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1fcb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcc0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1fcd0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1fce0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1fcf0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
1fd00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fd10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1fd20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1fd30 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fd40 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fd50 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fd60 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fd70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fd80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
1fd90 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1fda0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
1fdb0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1fdc0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fdd0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1fde0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fdf0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1fe00 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1fe10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fe20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
1fe30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1fe40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1fe50 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1fe60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fe70 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1fe80 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1fe90 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
1fea0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1feb0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
1fec0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1fed0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1fee0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1fef0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ff00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ff20 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
1ff30 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
1ff40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ff50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ff60 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
1ff70 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1ff80 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1ff90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1ffa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ffb0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1ffc0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1ffd0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1ffe0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1fff0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20000 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
20010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20020 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
20030 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20040 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
20050 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20060 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
20070 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
20080 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20090 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
200a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
200b0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
200c0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
200d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
200e0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
200f0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
20100 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20130 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
20140 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
20150 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
20160 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20170 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
20180 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
20190 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
201a0 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
201b0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
201c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
201d0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
201e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
201f0 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ce */..#ifndef S
20200 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
20210 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
20220 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20230 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
20240 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
20250 74 75 72 6e 20 70 45 78 70 72 2d 3e 79 2e 70 57  turn pExpr->y.pW
20260 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20  in->regResult;. 
20270 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
20280 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61       if( ConstFa
20290 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26  ctorOk(pParse) &
202a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
202b0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
202c0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
202d0 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   /* SQL function
202e0 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69  s can be expensi
202f0 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f  ve. So try to mo
20300 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63  ve constant func
20310 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a  tions.        **
20320 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
20330 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20  r loop, even if 
20340 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78  that means an ex
20350 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a  tra OP_Copy. */.
20360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
20370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
20380 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
20390 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  pr, -1);.      }
203a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
203b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
203c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
203d0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
203e0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
203f0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
20400 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
20410 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
20420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20430 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
20440 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
20450 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
20460 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
20470 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
20480 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20490 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
204a0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
204b0 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
204c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
204d0 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
204e0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
204f0 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , zId, nFarg, en
20500 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  c, 0);.#ifdef SQ
20510 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
20520 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
20530 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
20540 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
20550 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
20560 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
20570 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
20580 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67  "unknown", nFarg
20590 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
205a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
205b0 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70  if( pDef==0 || p
205c0 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  Def->xFinalize!=
205d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
205e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
205f0 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
20600 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a  nction: %s()", z
20610 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
20620 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
20630 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
20640 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
20650 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
20660 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
20670 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
20680 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
20690 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
206a0 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75  nnecessary evalu
206b0 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  ation of.      *
206c0 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74  * arguments past
206d0 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
206e0 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  ULL argument..  
206f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20700 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20710 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
20720 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
20730 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
20740 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
20750 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
20770 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20  arg>=2 );.      
20780 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20790 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
207a0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
207b0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  get);.        fo
207c0 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=1; i<nFarg; 
207d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
207e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
207f0 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
20800 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c   target, endCoal
20810 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  esce);.         
20820 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
20830 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20840 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20850 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
20860 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
20870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20880 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20890 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
208a0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
208b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
208c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
208d0 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
208e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
208f0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
20900 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
20910 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
20920 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
20930 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20940 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20950 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
20960 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
20970 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
20980 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20990 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
209a0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
209b0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
209c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
209d0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
209e0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
209f0 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
20a00 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
20a10 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
20a20 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
20a30 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
20a40 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
20a50 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
20a60 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
20a70 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
20a80 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
20a90 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
20aa0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
20ab0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20ac0 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
20ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
20ae0 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
20af0 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
20b00 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
20b10 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
20b20 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
20b30 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
20b40 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
20b50 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
20b60 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
20b70 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
20b80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20b90 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
20ba0 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
20bb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
20be0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
20bf0 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
20c00 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
20c10 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
20c20 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
20c30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
20c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
20c50 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
20c60 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
20c70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
20c80 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
20c90 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
20ca0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
20cb0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
20cc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20cd0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
20ce0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20cf0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
20d00 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
20d10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
20d20 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20d30 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20d40 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20d50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20d60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
20d70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
20d80 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
20d90 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
20da0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
20db0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
20dc0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
20dd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20de0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
20df0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
20e00 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
20e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
20e20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
20e30 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
20e40 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
20e50 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
20e60 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
20e70 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
20e80 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
20e90 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
20ea0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
20ec0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
20ed0 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
20ee0 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
20ef0 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
20f00 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
20f10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20f20 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20f30 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
20f40 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
20f50 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
20f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
20f70 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
20f80 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
20f90 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
20fa0 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
20fb0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
20fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
20fd0 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
20fe0 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
20ff0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
21000 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
21010 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
21020 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
21030 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
21040 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
21050 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21060 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21070 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21080 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
21090 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
210a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
210b0 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
210c0 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
210d0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
210e0 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
210f0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
21100 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21110 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
21120 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
21130 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
21140 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
21150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21160 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
21170 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
21180 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
21190 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
211c0 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
211d0 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
211e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211f0 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
21200 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
21210 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
21220 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
21230 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
21240 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
21250 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21260 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
21270 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
21280 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
21290 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
212a0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
212b0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
212c0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
212d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
212e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
212f0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
21300 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
21310 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
21320 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
21330 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
21340 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
21350 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
21360 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
21370 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
21380 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
21390 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
213a0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
213b0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
213c0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
213d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
213e0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
213f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
21400 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
21410 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
21420 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
21430 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
21440 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
21450 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
21460 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
21470 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
21480 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
21490 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
214a0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
214b0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
214c0 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
214d0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
214e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 66  ty(pExpr, EP_Inf
214f0 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
21500 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21510 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21520 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
21530 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
21540 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
21550 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
21560 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
21570 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21580 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21590 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
215a0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
215b0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
215c0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
215d0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
215e0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
215f0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
21600 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
21610 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
21620 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
21630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21640 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
21650 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
21660 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
21670 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  Q);.      }.#ifd
21680 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21690 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
216a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
216b0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
216c0 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20  ITE_FUNC_OFFSET 
216d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
216e0 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61  *pArg = pFarg->a
216f0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
21700 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d     if( pArg->op=
21710 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
21720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21730 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
21740 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69 54  Offset, pArg->iT
21750 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c  able, pArg->iCol
21760 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
21770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21790 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
217a0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
217b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
217c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
217d0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
217e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
217f0 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66  v, pParse->iSelf
21800 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e  Tab ? OP_PureFun
21810 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  c0 : OP_Function
21820 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21840 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
21850 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  et, (char*)pDef,
21860 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
21870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21880 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
21890 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d  )nFarg);.      }
218a0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
218b0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
218c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
218d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
218e0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
218f0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
21900 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21910 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
21920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
21930 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
21940 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
21950 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
21960 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
21970 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21980 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
21990 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
219a0 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
219b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
219c0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
219d0 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
219e0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
219f0 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
21a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
21a10 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
21a20 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
21a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a40 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
21a50 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
21a60 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
21a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
21a80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21a90 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
21aa0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
21ab0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   n;.      if( pE
21ac0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
21ad0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
21ae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21af0 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43  Table = sqlite3C
21b00 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
21b10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
21b20 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
21b30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21b40 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
21b50 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
21b60 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21b70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
21b80 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70  able.       && p
21b90 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e  Expr->iTable!=(n
21ba0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
21bb0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
21bc0 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29  pLeft)) .      )
21bd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21be0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21bf0 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
21c00 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
21c10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
21c40 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
21c50 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
21c60 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21c70 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
21c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21c90 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
21ca0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
21cb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21cc0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21cd0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21cf0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d10 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21d20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21d40 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
21d50 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
21d60 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21d80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21d90 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
21da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21dc0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
21dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
21df0 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
21e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21e10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21e20 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
21e30 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
21e40 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
21e50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
21e60 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
21e70 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
21e80 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
21e90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21ea0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
21eb0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
21ec0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
21ed0 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
21ee0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
21ef0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
21f00 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
21f10 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21f20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
21f30 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
21f40 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21f50 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
21f60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
21f70 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
21f80 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
21f90 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
21fa0 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
21fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21fc0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
21fd0 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
21fe0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
21ff0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
22000 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45  PLUS: {.      pE
22010 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
22020 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ft;.      goto e
22030 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b  xpr_code_doover;
22040 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20   /* 2018-04-28: 
22050 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63  Prevent deep rec
22060 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e  ursion. OSSFuzz.
22070 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63   */.    }..    c
22080 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
22090 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
220a0 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
220b0 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
220c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
220d0 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
220e0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
220f0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
22100 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22110 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
22120 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
22130 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
22140 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
22150 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
22160 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
22170 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
22180 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
22190 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
221a0 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
221b0 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
221c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
221d0 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
221e0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
221f0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
22200 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
22210 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
22220 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
22230 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
22240 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
22250 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
22260 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
22270 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
22280 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
22290 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
222a0 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
222b0 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
222c0 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
222d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
222e0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
222f0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
22300 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
22310 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
22320 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
22330 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
22340 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
22350 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
22360 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
22370 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
22380 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
22390 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
223a0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
223b0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
223c0 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
223d0 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
223e0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
223f0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
22400 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
22410 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
22420 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
22430 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
22440 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
22450 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
22460 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
22470 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
22480 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
22490 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
224a0 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
224b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
224c0 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
224d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
224e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
224f0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
22500 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
22510 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
22520 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
22530 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
22540 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
22550 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
22560 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
22570 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
22580 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
22590 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
225a0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
225b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
225c0 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
225d0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
225e0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
225f0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
22600 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
22610 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22620 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
22630 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
22640 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
22650 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
22660 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
22670 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
22680 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
22690 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
226a0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
226b0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
226c0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
226d0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
226e0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
226f0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
22700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22710 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
22720 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
22730 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22740 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61  r[%d]=%s.%s", ta
22750 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70  rget,.        (p
22760 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
22770 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
22780 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
22790 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
227a0 64 22 20 3a 20 70 45 78 70 72 2d 3e 79 2e 70 54  d" : pExpr->y.pT
227b0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
227c0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
227d0 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
227e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
227f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22810 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22820 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22830 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22840 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
22850 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
22860 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
22870 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
22880 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
22890 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
228a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
228b0 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
228c0 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
228d0 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
228e0 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
228f0 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22900 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22910 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22920 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22930 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22940 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
22950 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
22960 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
22970 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
22980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
22990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
229a0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
229b0 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
229c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
229d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
229e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
229f0 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22a00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22a10 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22a20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22a40 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
22a50 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
22a60 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
22a70 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
22a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22a90 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
22aa0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
22ab0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
22ac0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
22ad0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
22ae0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
22af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22b00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
22b10 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
22b20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22b30 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
22b40 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
22b50 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
22b60 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
22b70 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
22b80 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
22b90 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
22ba0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
22bb0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22bc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22bd0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
22be0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
22bf0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
22c00 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
22c10 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
22c20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
22c30 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
22c40 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
22c50 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
22c60 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
22c70 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
22c80 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
22c90 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
22ca0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
22cb0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
22cc0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
22cd0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22ce0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
22cf0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
22d00 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
22d10 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
22d20 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
22d30 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
22d40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
22d50 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
22d60 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
22d70 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
22d80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22d90 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
22da0 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
22db0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
22dc0 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
22dd0 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
22de0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
22df0 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
22e00 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
22e10 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
22e20 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
22e30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
22e40 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
22e50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
22e60 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
22e70 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
22e80 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
22e90 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
22ea0 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
22eb0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
22ec0 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
22ed0 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
22ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
22ef0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
22f00 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
22f10 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
22f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f30 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
22f40 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
22f50 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
22f60 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
22f90 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
22fa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
22fb0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
22fe0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
22ff0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23020 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
23030 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23040 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23050 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
23060 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
23070 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23080 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
23090 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
230a0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
230b0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
230c0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
230d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
230e0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
230f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23120 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
23130 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
23140 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
23150 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
23160 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
23170 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
23180 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
23190 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
231a0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
231b0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
231c0 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
231d0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
231e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
231f0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
23200 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23210 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
23220 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
23230 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
23240 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
23250 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
23260 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23270 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
23280 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
23290 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
232a0 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
232b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
232c0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
232d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
232e0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
232f0 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
23300 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
23310 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
23320 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23330 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23340 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23350 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
23360 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
23370 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
23380 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
23390 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
233a0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
233b0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
233c0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
233d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
233e0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
233f0 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23400 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23410 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23420 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23430 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23440 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23450 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23460 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23470 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
23480 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23490 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
234a0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
234b0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
234c0 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
234d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
234e0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
234f0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
23500 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
23510 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
23520 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
23530 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
23540 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
23550 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
23560 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23570 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
23580 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
23590 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
235a0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
235b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
235c0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
235d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
235e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
235f0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
23600 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23610 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23620 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
23630 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
23640 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23650 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23660 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
23670 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
23680 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
236a0 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
236b0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
236c0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
236d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
236e0 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
236f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23700 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23710 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
23720 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23730 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
23740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23750 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23760 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
23770 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23780 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
237a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
237b0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
237c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
237d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
237e0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
237f0 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
23800 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
23810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
23820 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
23830 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
23840 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
23850 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
23860 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
23870 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
23880 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
23890 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
238a0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
238b0 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
238c0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
238d0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
238e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
238f0 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
23900 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
23910 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23920 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
23950 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
23960 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
23970 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
23980 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
23990 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
239a0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
239b0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
239c0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
239d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
239e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
239f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23a00 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
23a10 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
23a20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23a30 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
23a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23a50 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
23a60 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
23a70 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
23a80 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
23a90 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
23aa0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
23ab0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
23ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
23ad0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23ae0 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
23af0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
23b00 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
23b30 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
23b40 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
23b50 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
23b60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
23b70 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
23b80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23b90 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
23ba0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23bb0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
23bc0 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
23bd0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
23be0 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
23bf0 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
23c00 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
23c10 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23c20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  time..**.** If r
23c30 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74  egDest>=0 then t
23c40 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
23c50 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ays stored in th
23c60 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  at register and 
23c70 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  the.** result is
23c80 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20   not reusable.  
23c90 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65  If regDest<0 the
23ca0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23cb0 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74  s free to .** st
23cc0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68  ore the value wh
23cd0 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73  ereever it wants
23ce0 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
23cf0 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
23d00 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72  sion .** is stor
23d10 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ed is returned. 
23d20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c   When regDest<0,
23d30 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65   two identical e
23d40 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a  xpressions will.
23d50 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73  ** code to the s
23d60 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  ame register..*/
23d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23d80 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
23d90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23da0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23db0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
23dc0 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
23dd0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
23de0 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
23df0 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
23e00 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20  .  int regDest  
23e10 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
23e20 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
23e30 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
23e40 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
23e50 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
23e60 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
23e70 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
23e80 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28  ConstExpr;.  if(
23e90 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20   regDest<0 && p 
23ea0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
23eb0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
23ec0 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  em;.    int i;. 
23ed0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
23ee0 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
23ef0 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
23f00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
23f10 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
23f20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
23f30 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70  re(0,pItem->pExp
23f40 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
23f50 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
23f60 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
23f70 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d  ExprReg;.      }
23f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
23f90 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23fa0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
23fb0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
23fc0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23fd0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23fe0 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
23ff0 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
24000 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24010 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
24020 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
24030 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
24040 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20  = regDest<0;.   
24050 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
24060 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50  ) regDest = ++pP
24070 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
24080 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
24090 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
240a0 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  t;.  }.  pParse-
240b0 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
240c0 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73  .  return regDes
240d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
240e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
240f0 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
24100 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
24110 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
24120 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
24130 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
24140 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
24150 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
24160 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
24170 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
24180 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
24190 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
241a0 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
241b0 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
241c0 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
241d0 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
241e0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
241f0 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
24200 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
24210 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
24220 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
24230 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
24240 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
24250 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
24260 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
24270 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
24280 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
24290 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
242a0 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
242b0 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
242c0 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
242d0 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
242e0 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
242f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24300 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
24310 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24320 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
24330 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
24340 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
24350 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
24360 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
24370 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
24380 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
24390 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
243a0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
243b0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
243c0 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20    ){.    *pReg  
243d0 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  = 0;.    r2 = sq
243e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
243f0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
24400 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, -1);.  }else{
24410 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
24420 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24430 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
24440 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24450 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24460 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
24470 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
24480 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
24490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
244a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
244b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
244c0 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
244d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
244e0 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
244f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24500 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24510 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24520 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24530 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24540 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24550 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24560 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24570 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24580 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24590 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
245a0 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
245b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
245c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
245d0 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
245e0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
245f0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
24600 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
24610 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
24620 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
24630 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
24640 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
24650 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
24660 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
24670 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
24680 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
24690 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
246a0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
246b0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
246c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
246d0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
246e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
246f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
24700 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
24710 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
24720 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
24730 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24740 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
24750 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
24760 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
24770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
24780 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
24790 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
247a0 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
247b0 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
247c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
247d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
247e0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
247f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
24800 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
24810 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
24820 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
24830 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
24840 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24850 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
24860 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24870 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24880 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
24890 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
248a0 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
248b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
248c0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
248d0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
248e0 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
248f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
24900 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24910 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
24920 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
24930 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24940 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
24950 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
24960 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
24970 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
24980 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
24990 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
249a0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
249b0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
249c0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
249d0 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
249e0 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
249f0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
24a00 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
24a10 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
24a20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
24a30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
24a40 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
24a50 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
24a60 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
24a70 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24a80 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
24a90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
24aa0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
24ab0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
24ac0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
24ad0 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
24ae0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
24af0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
24b00 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
24b10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24b20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
24b30 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
24b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24b50 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
24b60 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e  luates the given
24b70 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
24b80 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
24b90 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24ba0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
24bb0 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
24bc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24bd0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
24be0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
24bf0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
24c00 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
24c10 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
24c20 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
24c30 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
24c40 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
24c50 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
24c60 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
24c70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
24c80 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
24c90 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
24ca0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
24cb0 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
24cc0 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
24cd0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
24ce0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24cf0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
24d00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24d10 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
24d20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24d30 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24d40 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
24d50 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24d60 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
24d70 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24d80 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
24d90 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24da0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
24db0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24dc0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24dd0 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
24de0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e00 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
24e10 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
24e20 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
24e30 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f  xpr, iMem);.}../
24e40 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24e50 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
24e60 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
24e70 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
24e80 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
24e90 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
24ea0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
24eb0 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
24ec0 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
24ed0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
24ee0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
24ef0 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20  evaluated.  The 
24f00 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
24f10 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20  will.** usually 
24f20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  be pList->nExpr 
24f30 62 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64  but might be red
24f40 75 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45  uced if SQLITE_E
24f50 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69  CEL_OMITREF.** i
24f60 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  s defined..**.**
24f70 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24f80 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e  _DUP flag preven
24f90 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ts the arguments
24fa0 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66   from being.** f
24fb0 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  illed using OP_S
24fc0 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d  Copy.  OP_Copy m
24fd0 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
24fe0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
24ff0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
25000 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77  R argument allow
25010 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  s constant argum
25020 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61  ents to be.** fa
25030 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20  ctored out into 
25040 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
25050 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ode..**.** The S
25060 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66  QLITE_ECEL_REF f
25070 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65  lag means that e
25080 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
25090 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45  e list with.** E
250a0 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e  xprList.a[].u.x.
250b0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61  iOrderByCol>0 ha
250c0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
250d0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74  evaluated and st
250e0 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73  ored.** in regis
250f0 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20  ters at srcReg, 
25100 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65  and so the value
25110 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66   can be copied f
25120 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66  rom there..** If
25130 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
25140 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74  TREF is also set
25150 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
25160 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65  s with u.x.iOrde
25170 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20  rByCol>0.** are 
25180 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72  simply omitted r
25190 61 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67  ather than being
251a0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63   copied from src
251b0 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Reg..*/.int sqli
251c0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
251d0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
251e0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
251f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
25200 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
25210 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
25220 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
25230 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
25240 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
25250 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
25260 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
25270 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
25280 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
25290 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
252a0 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
252b0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
252c0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
252d0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
252e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
252f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
25300 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
25310 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
25320 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
25330 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
25340 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
25350 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
25360 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
25370 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
25380 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
25390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
253a0 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
253b0 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
253c0 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
253d0 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
253e0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
253f0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
25400 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
25410 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
25420 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
25430 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
25440 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
25450 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
25460 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
25470 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr;.#ifdef SQLIT
25480 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
25490 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
254a0 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65  f( pItem->bSorte
254b0 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d  rRef ){.      i-
254c0 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  -;.      n--;.  
254d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
254e0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
254f0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
25500 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65  !=0 && (j = pIte
25510 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
25520 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ol)>0 ){.      i
25530 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
25540 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29  E_ECEL_OMITREF )
25550 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20  {.        i--;. 
25560 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
25570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25590 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b  p2(v, copyOp, j+
255a0 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74  srcReg-1, target
255b0 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
255c0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
255d0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
255e0 46 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20  FACTOR)!=0.     
255f0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
25600 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
25610 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20  tJoin(pExpr).   
25620 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25630 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
25640 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25650 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65  arget+i);.    }e
25660 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
25670 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
25680 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
25690 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
256a0 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
256b0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
256c0 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
256d0 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
256e0 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f   if( copyOp==OP_
256f0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
25700 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62   (pOp=sqlite3Vdb
25710 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e  eGetOp(v, -1))->
25720 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a  opcode==OP_Copy.
25730 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
25740 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69  >p1+pOp->p3+1==i
25750 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
25760 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
25770 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20  +1==target+i.   
25780 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25790 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
257a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
257b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
257c0 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
257d0 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
257e0 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +i);.        }. 
257f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25800 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
25810 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25820 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
25830 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
25840 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
25850 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
25860 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
25870 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
25880 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
25890 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
258a0 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
258b0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
258c0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
258d0 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e  n.** elimination
258e0 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   of x..**.** The
258f0 20 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74   xJumpIf paramet
25900 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65  er determines de
25910 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tails:.**.**    
25920 4e 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  NULL:           
25930 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
25940 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
25950 20 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a   in reg[dest].**
25960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25970 66 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70  fTrue:      Jump
25980 20 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65   to dest if true
25990 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78  .**    sqlite3Ex
259a0 70 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a  prIfFalse:     J
259b0 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66  ump to dest if f
259c0 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  alse.**.** The j
259d0 75 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65  umpIfNull parame
259e0 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
259f0 66 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c  f xJumpIf is NUL
25a00 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
25a10 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
25a20 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
25a30 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
25a40 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
25a50 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
25a60 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
25a70 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
25a80 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
25a90 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
25aa0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
25ab0 73 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f  stination or sto
25ac0 72 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f  rage location */
25ad0 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29  .  void (*xJump)
25ae0 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
25af0 74 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f  t,int), /* Actio
25b00 6e 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69  n to take */.  i
25b10 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
25b20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
25b30 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
25b40 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
25b50 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
25b60 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
25b70 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
25b80 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
25b90 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
25ba0 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
25bb0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
25bc0 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
25bd0 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
25be0 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
25bf0 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
25c00 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
25c10 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
25c20 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
25c30 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
25c40 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  ...  memset(&com
25c50 70 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pLeft, 0, sizeof
25c60 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25c70 74 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c  t(&compRight, 0,
25c80 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
25c90 20 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e    memset(&exprAn
25ca0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  d, 0, sizeof(Exp
25cb0 72 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r));..  assert( 
25cc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
25cd0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
25ce0 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
25cf0 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
25d00 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
25d10 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
25d20 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
25d30 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
25d40 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
25d50 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
25d60 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
25d70 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
25d80 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
25d90 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
25da0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
25db0 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
25dc0 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
25dd0 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
25de0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
25df0 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
25e00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
25e10 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
25e20 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
25e30 70 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  prX, exprCodeVec
25e40 74 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70  tor(pParse, &exp
25e50 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
25e60 0a 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a  .  if( xJump ){.
25e70 20 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65      xJump(pParse
25e80 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
25e90 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
25eb0 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  ark the expressi
25ec0 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d  on is being from
25ed0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
25ee0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
25ef0 6e 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  n.    ** so that
25f00 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   the sqlite3Expr
25f10 43 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75  CodeTarget() rou
25f20 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  tine will not at
25f30 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20  tempt to move.  
25f40 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65    ** it into the
25f50 20 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70   Parse.pConstExp
25f60 72 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75  r list.  We shou
25f70 6c 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74  ld use a new bit
25f80 20 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a   for this,.    *
25f90 2a 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62  * for clarity, b
25fa0 75 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66  ut we are out of
25fb0 20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70   bits in the Exp
25fc0 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f  r.flags field so
25fd0 20 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   we.    ** have 
25fe0 74 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f  to reuse the EP_
25ff0 46 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42  FromJoin bit.  B
26000 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78  ummer. */.    ex
26010 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  prX.flags |= EP_
26020 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71  FromJoin;.    sq
26030 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
26040 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70  get(pParse, &exp
26050 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d  rAnd, dest);.  }
26060 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
26070 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
26080 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
26090 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
260a0 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
260b0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  */.  testcase( x
260c0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
260d0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
260e0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
260f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26100 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26110 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26120 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
26130 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26140 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26150 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26160 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26170 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
26180 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26190 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
261a0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
261b0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
261c0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
261d0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
261e0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
261f0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26200 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
26210 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26220 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26230 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26240 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26250 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26260 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26270 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26280 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26290 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
262a0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
262b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
262c0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
262d0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
262e0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
262f0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26300 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20  tcase( xJump==0 
26310 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
26320 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
26330 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
26340 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
26350 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
26360 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
26370 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
26380 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
26390 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
263a0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
263b0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
263c0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
263d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
263e0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
263f0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
26400 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
26410 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
26420 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
26430 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
26440 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
26450 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
26460 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
26470 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
26480 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
26490 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
264a0 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
264b0 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
264c0 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
264d0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
264e0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
264f0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
26500 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
26510 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
26520 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
26530 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
26540 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
26550 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
26560 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
26570 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
26580 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
26590 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
265a0 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
265b0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
265c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
265d0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
265e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
265f0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
26600 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
26610 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26620 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
26630 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
26640 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
26650 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
26660 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
26670 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
26680 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
26690 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
266a0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
266b0 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
266c0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
266d0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
266e0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
266f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
26700 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
26710 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
26720 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
26730 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
26740 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
26750 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
26760 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
26770 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
26780 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
267a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
267b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
267c0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
267d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
267e0 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
267f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
26800 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26810 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26820 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
26830 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26850 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
26860 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
26870 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26880 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
26890 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
268a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
268b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
268c0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
268d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
268e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
268f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26900 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26910 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
26920 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26940 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
26950 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
26960 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26970 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
26980 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
269a0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
269b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
269c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
269d0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
269e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
269f0 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f  t;      /* IS NO
26a00 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  T TRUE or IS NOT
26a10 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
26a20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 20  int isTrue;     
26a30 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
26a40 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
26a50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26a60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26a70 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
26a80 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
26a90 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
26aa0 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
26ab0 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
26ac0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
26ad0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
26ae0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
26af0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
26b00 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
26b10 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
26b20 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
26b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
26b40 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
26b50 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
26b80 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
26b90 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
26ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
26bb0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26bc0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26bd0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
26c00 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26c10 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
26c20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26c30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
26c40 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
26c50 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
26c60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
26c70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
26c80 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
26c90 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
26ca0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
26cb0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
26cc0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
26cd0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
26ce0 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
26cf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
26d00 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
26d10 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
26d20 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
26d30 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
26d40 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
26d50 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
26d60 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
26d70 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
26d80 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
26d90 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
26da0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26db0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
26dc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26dd0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26de0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26df0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
26e00 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
26e10 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26e20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
26e30 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
26e40 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
26e50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26e60 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
26e70 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
26e80 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
26e90 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26ea0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26eb0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
26ec0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
26ed0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26ee0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
26ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26f00 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
26f10 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
26f20 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26f30 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
26f40 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
26f50 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
26f60 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
26f70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26f80 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
26f90 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
26fa0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
26fb0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
26fc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26fd0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
26fe0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
26ff0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
27000 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
27010 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27020 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
27030 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27040 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27050 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27060 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27070 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
27080 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27090 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
270a0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
270b0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
270c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
270d0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
270e0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
270f0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27100 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27110 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27120 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
27130 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27140 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27150 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27170 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
27180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27190 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
271a0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
271b0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
271c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
271d0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
271e0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
271f0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
27200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
27210 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
27220 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
27230 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
27240 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27260 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27270 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27280 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
27290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
272a0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
272b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
272c0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
272d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
272e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
272f0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
27300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27310 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27330 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
27340 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
27350 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27360 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27370 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
27380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
27390 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
273a0 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
273b0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
273c0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
273d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
273e0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
273f0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
27400 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
27410 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27420 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
27430 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
27440 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
27450 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
27460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27470 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
27480 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
27490 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
274a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
274b0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
274c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
274d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
274e0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
274f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27500 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
27510 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
27520 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
27530 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
27540 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
27550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27560 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
27570 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27580 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
27590 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
275a0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
275b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
275c0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
275d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
275e0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
275f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
27600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
27610 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
27620 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
27630 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
27640 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
27650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27660 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27670 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27680 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
276a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
276b0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
276c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
276d0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
276e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
276f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
27700 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
27710 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
27720 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
27730 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
27740 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
27750 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
27760 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
27770 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
27780 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
27790 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
277a0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
277b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
277c0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
277d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
277e0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
277f0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
27800 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
27810 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
27820 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
27830 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
27840 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
27850 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
27860 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27870 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
27880 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
27890 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
278a0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
278b0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
278c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
278d0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
278e0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
278f0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
27900 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
27910 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
27920 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27930 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
27940 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27950 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
27960 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
27970 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
27980 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
27990 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
279a0 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
279b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
279c0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
279d0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
279e0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
279f0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
27a00 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
27a10 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
27a20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
27a30 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
27a40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
27a50 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
27a60 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
27a70 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
27a80 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
27a90 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27ab0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
27ac0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
27ad0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
27ae0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
27af0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
27b00 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
27b10 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
27b20 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27b40 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
27b50 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
27b60 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
27b70 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
27b80 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
27b90 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
27ba0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
27bb0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
27bc0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27bd0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27be0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27bf0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27c00 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
27c10 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
27c20 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
27c30 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
27c40 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
27c50 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
27c60 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
27c70 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
27c80 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
27c90 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
27ca0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
27cb0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
27cc0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27cd0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27ce0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27cf0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27d00 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
27d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27d20 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
27d30 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
27d40 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
27d50 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
27d60 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
27d70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27d80 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
27d90 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
27da0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27db0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
27dc0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
27dd0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27de0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27e00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
27e10 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
27e20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27e30 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
27e40 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
27e50 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
27e60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27e70 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27e80 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27e90 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27ea0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27eb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27ec0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27ed0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27ee0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27ef0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27f00 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27f10 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27f20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27f30 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
27f40 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
27f50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
27f60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
27f70 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27f80 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27f90 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27fa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27fb0 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
27fc0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
27fd0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
27fe0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27ff0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28000 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
28010 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28020 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28030 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
28040 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28050 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28060 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
28070 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28080 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
28090 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
280a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
280b0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
280c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
280d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
280e0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
280f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f  {.      int isNo
28100 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54  t;   /* IS NOT T
28110 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
28120 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
28130 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20   isTrue;  /* IS 
28140 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
28150 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
28160 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28170 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
28180 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
28190 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
281a0 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
281b0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
281c0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
281d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
281e0 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
281f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28200 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
28210 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
28220 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
28230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
28240 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f  S TRUE and IS NO
28250 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20  T FALSE */.     
28260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28270 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
28280 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
282b0 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  ot ? 0 : SQLITE_
282c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20  JUMPIFNULL);..  
282d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
282e0 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61     /* IS FALSE a
282f0 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  nd IS NOT TRUE *
28300 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
28310 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28320 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28330 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
28360 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
28370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28380 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28390 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
283a0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
283b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
283c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
283d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
283e0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
283f0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
28400 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
28410 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
28420 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
28430 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
28440 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
28450 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
28460 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
28470 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
28480 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
28490 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
284a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
284b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
284c0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
284d0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
284e0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
284f0 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
28500 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
28510 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28520 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
28530 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28540 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28550 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
28560 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
28570 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28580 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28590 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
285a0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
285b0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
285c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
285d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
285e0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
285f0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
28600 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28620 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
28630 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
28640 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28650 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
28660 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
28670 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
28680 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
28690 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
286a0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
286b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
286c0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
286d0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
286e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
286f0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
28700 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
28710 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
28720 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
28730 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28740 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
28750 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
28760 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
28770 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
28780 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28790 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
287a0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
287b0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
287c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
287d0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
287e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
287f0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
28800 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
28810 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
28820 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
28830 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28840 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
28850 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
28860 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28870 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28880 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
28890 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
288a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
288b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
288c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
288d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
288e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
288f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28900 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
28910 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
28920 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
28930 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28940 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28950 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28960 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
28970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28980 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
28990 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
289a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
289b0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
289c0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
289d0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
289e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
289f0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
28a00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28a10 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
28a20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28a30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28a50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
28a60 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28a70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28a80 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28a90 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28aa0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28ab0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28ac0 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66  rIfFalse, jumpIf
28ad0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
28ae0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
28af0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28b00 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
28b10 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
28b20 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
28b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b40 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28b50 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28b60 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28b70 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
28b80 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
28b90 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28ba0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
28bb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
28bc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28bd0 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
28be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28bf0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28c00 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
28c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
28c30 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
28c40 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
28c50 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20  xpr: .      if( 
28c60 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
28c70 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28c80 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28c90 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28ca0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
28cb0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
28cc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28cd0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
28ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
28cf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28d00 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
28d10 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
28d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28d30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
28d40 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
28d50 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
28d60 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
28d70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
28d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28d90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28db0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28dd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
28de0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28df0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
28e00 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
28e10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
28e20 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
28e30 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  e2);.}../*.** Li
28e40 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  ke sqlite3ExprIf
28e50 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74  False() except t
28e60 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61  hat a copy is ma
28e70 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f  de of pExpr befo
28e80 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  re.** code gener
28e90 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20  ation, and that 
28ea0 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20  copy is deleted 
28eb0 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72  after code gener
28ec0 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65  ation. This.** e
28ed0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
28ee0 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69  original pExpr i
28ef0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
28f00 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
28f10 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65  IfFalseDup(Parse
28f20 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28f30 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
28f40 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
28f50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
28f60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
28f70 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  xpr *pCopy = sql
28f80 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
28f90 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
28fa0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28fb0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
28fc0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28fd0 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65  Parse, pCopy, de
28fe0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28ff0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
29000 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
29010 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  py);.}../*.** Ex
29020 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73  pression pVar is
29030 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
29040 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  e an SQL variabl
29050 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20  e. pExpr may be 
29060 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65  any.** type of e
29070 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
29080 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
29090 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20  imple SQL value 
290a0 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65  - an integer, re
290b0 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62  al, string, blob
290c0 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75  .** or NULL valu
290d0 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42  e - then the VDB
290e0 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  E currently bein
290f0 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f  g prepared is co
29100 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72  nfigured.** to r
29110 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74  e-prepare each t
29120 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ime a new value 
29130 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  is bound to vari
29140 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a  able pVar..**.**
29150 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
29160 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d  f pExpr is a sim
29170 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e  ple SQL value an
29180 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74  d the value is t
29190 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68  he.** same as th
291a0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75  at currently bou
291b0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
291c0 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  Var, non-zero is
291d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
291e0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
291f0 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74  values are not t
29200 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45  he same or if pE
29210 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  xpr is not a sim
29220 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65  ple.** SQL value
29230 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
29240 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29250 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72  t exprCompareVar
29260 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  iable(Parse *pPa
29270 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c  rse, Expr *pVar,
29280 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
29290 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
292a0 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69  int iVar;.  sqli
292b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a  te3_value *pL, *
292c0 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c  pR = 0;.  .  sql
292d0 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
292e0 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
292f0 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
29300 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
29310 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70  B, &pR);.  if( p
29320 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20  R ){.    iVar = 
29330 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pVar->iColumn;. 
29340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
29350 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
29360 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
29370 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56     pL = sqlite3V
29380 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
29390 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
293a0 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54  are, iVar, SQLIT
293b0 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20  E_AFF_BLOB);.   
293c0 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20   if( pL ){.     
293d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
293e0 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c  ue_type(pL)==SQL
293f0 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
29400 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
29410 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d  e_text(pL); /* M
29420 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63  ake sure the enc
29430 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a  oding is UTF-8 *
29440 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29450 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65  res =  0==sqlite
29460 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20  3MemCompare(pL, 
29470 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pR, 0);.    }.  
29480 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
29490 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69  ee(pR);.    sqli
294a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29  te3ValueFree(pL)
294b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
294c0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  res;.}../*.** Do
294d0 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
294e0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
294f0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
29500 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
29510 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
29520 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
29530 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
29540 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
29550 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
29560 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
29570 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
29580 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
29590 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
295a0 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
295b0 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
295c0 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
295d0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
295e0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
295f0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
29600 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
29610 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
29620 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
29630 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
29640 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
29650 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
29660 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
29670 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
29680 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
29690 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
296a0 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
296b0 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
296c0 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
296d0 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
296e0 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
296f0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
29700 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
29710 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
29720 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
29730 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
29740 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
29750 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
29760 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
29770 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
29780 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
29790 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
297a0 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
297b0 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
297c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
297d0 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
297e0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
297f0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
29800 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
29810 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
29820 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
29830 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
29840 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
29850 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
29860 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
29870 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
29880 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
29890 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
298a0 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
298b0 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
298c0 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
298d0 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
298e0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
298f0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
29900 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
29910 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
29920 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
29930 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
29940 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   malfunction..**
29950 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
29960 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54   not NULL then T
29970 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73  K_VARIABLE terms
29980 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64   in pA with bind
29990 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73  ings in.** pPars
299a0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61  e->pReprepare ca
299b0 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  n be matched aga
299c0 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e  inst literals in
299d0 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50   pB.  The .** pP
299e0 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
299f0 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20  mask bitmask is 
29a00 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68  updated for each
29a10 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
29a20 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72  nced..** If pPar
29a30 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20  se is NULL (the 
29a40 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65  normal case) the
29a50 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  n any TK_VARIABL
29a60 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72  E term in .** Ar
29a70 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68  gument pParse sh
29a80 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
29a90 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
29aa0 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20  not NULL and pA 
29ab0 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20  or.** pB causes 
29ac0 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  a return value o
29ad0 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 2..*/.int sqli
29ae0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50  te3ExprCompare(P
29af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
29b00 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
29b10 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75  , int iTab){.  u
29b20 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  32 combinedFlags
29b30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
29b40 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
29b50 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20  turn pB==pA ? 0 
29b60 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  : 2;.  }.  if( p
29b70 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d  Parse && pA->op=
29b80 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20  =TK_VARIABLE && 
29b90 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61  exprCompareVaria
29ba0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20  ble(pParse, pA, 
29bb0 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pB) ){.    retur
29bc0 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69  n 0;.  }.  combi
29bd0 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66  nedFlags = pA->f
29be0 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73  lags | pB->flags
29bf0 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  ;.  if( combined
29c00 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  Flags & EP_IntVa
29c10 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28  lue ){.    if( (
29c20 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c  pA->flags&pB->fl
29c30 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29  ags&EP_IntValue)
29c40 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61  !=0 && pA->u.iVa
29c50 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75  lue==pB->u.iValu
29c60 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
29c70 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
29c80 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
29c90 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
29ca0 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  p || pA->op==TK_
29cb0 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69 66 28  RAISE ){.    if(
29cc0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
29cd0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
29ce0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
29cf0 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69  , pA->pLeft,pB,i
29d00 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
29d10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
29d20 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
29d30 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
29d40 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
29d50 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e  (pParse, pA,pB->
29d60 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b  pLeft,iTab)<2 ){
29d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
29d80 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
29d90 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
29da0 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
29db0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
29dc0 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
29dd0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
29de0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
29df0 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
29e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
29e10 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
29e20 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
29e30 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 23  =0 ) return 2;.#
29e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29e50 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
29e60 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
29e70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 73 73  tion for the ass
29e80 65 72 74 28 29 3a 0a 20 20 20 20 20 20 2a 2a 20  ert():.      ** 
29e90 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
29ea0 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f   have p->op==TK_
29eb0 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61 67 67  FUNCTION but agg
29ec0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
29ed0 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 70  .      ** have p
29ee0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
29ef0 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20 63  CTION.  So any c
29f00 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
29f10 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 20  n an aggregate. 
29f20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
29f30 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75   and a window fu
29f40 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61  nction should ha
29f50 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65  ve failed before
29f60 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 20 20   reaching.      
29f70 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20  ** this point.  
29f80 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  And, it is not p
29f90 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
29fa0 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
29fb0 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 61  n and.      ** a
29fc0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
29fd0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
29fe0 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ame and number o
29ff0 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 6f  f arguments.  So
2a000 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 77 65 20  .      ** if we 
2a010 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2a020 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64 20 42  , either A and B
2a030 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66 75 6e   both window fun
2a040 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20 20 20  ctions or.      
2a050 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20 61  ** neither are a
2a060 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a070 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
2a080 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
2a090 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e  rty(pA,EP_WinFun
2a0a0 63 29 3d 3d 45 78 70 72 48 61 73 50 72 6f 70 65  c)==ExprHasPrope
2a0b0 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e  rty(pB,EP_WinFun
2a0c0 63 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  c) );.      if( 
2a0d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a0e0 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  pA,EP_WinFunc) )
2a0f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
2a100 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61  lite3WindowCompa
2a110 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e 79 2e  re(pParse,pA->y.
2a120 70 57 69 6e 2c 70 42 2d 3e 79 2e 70 57 69 6e 29  pWin,pB->y.pWin)
2a130 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
2a140 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2a150 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d     }else if( pA-
2a160 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2a170 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
2a180 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d  ite3_stricmp(pA-
2a190 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a1a0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
2a1b0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
2a1c0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
2a1d0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
2a1e0 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
2a1f0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
2a200 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
2a210 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2a220 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
2a230 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2a240 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a250 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61  if( (combinedFla
2a260 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
2a270 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  y)==0 ){.    if(
2a280 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
2a290 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
2a2a0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2a2b0 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  ( (combinedFlags
2a2c0 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d   & EP_FixedCol)=
2a2d0 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  =0.     && sqlit
2a2e0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a2f0 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c  arse, pA->pLeft,
2a300 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
2a310 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a320 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2a330 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2a340 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d   pA->pRight, pB-
2a350 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2a360 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a370 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
2a380 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
2a390 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
2a3a0 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
2a3b0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 2;.    if( pA
2a3c0 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a  ->op!=TK_STRING.
2a3d0 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d       && pA->op!=
2a3e0 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20 20  TK_TRUEFALSE.   
2a3f0 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c    && (combinedFl
2a400 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
2a410 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
2a420 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d    if( pA->iColum
2a430 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
2a440 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a450 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
2a460 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20  =pB->iTable .   
2a470 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62      && (pA->iTab
2a480 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45  le!=iTab || NEVE
2a490 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29  R(pB->iTable>=0)
2a4a0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2a4b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a4c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
2a4d0 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73  pare two ExprLis
2a4e0 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75  t objects.  Retu
2a4f0 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65  rn 0 if they are
2a500 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a   identical and .
2a510 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
2a520 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
2a530 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  y way..**.** If 
2a540 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
2a550 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
2a560 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
2a570 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
2a580 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
2a590 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
2a5a0 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
2a5b0 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
2a5c0 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
2a5d0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2a5e0 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
2a5f0 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
2a600 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
2a610 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
2a620 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
2a630 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
2a640 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
2a650 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
2a660 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
2a670 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
2a680 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
2a690 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
2a6a0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
2a6b0 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
2a6c0 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
2a6d0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
2a6e0 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
2a6f0 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
2a700 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
2a710 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
2a720 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
2a730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a740 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
2a750 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
2a760 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54  List *pB, int iT
2a770 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ab){.  int i;.  
2a780 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
2a790 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2a7a0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
2a7b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2a7c0 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
2a7d0 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
2a7e0 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
2a7f0 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
2a800 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2a810 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
2a820 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
2a830 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
2a840 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
2a850 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
2a860 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Order!=pB->a[i].
2a870 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2a880 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
2a890 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2a8a0 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70  (0, pExprA, pExp
2a8b0 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
2a8c0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2a8d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
2a8e0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
2a8f0 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74 20  ompare() except 
2a900 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2a910 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  s at the top-lev
2a920 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65  el.** are ignore
2a930 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2a940 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
2a950 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
2a960 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
2a970 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2a980 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
2a990 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a9a0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2a9b0 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20 20  te(pA),.        
2a9c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a9d0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c  SkipCollate(pB),
2a9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54  .             iT
2a9f0 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ab);.}../*.** Re
2aa00 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
2aa10 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45  can prove the pE
2aa20 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
2aa30 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a   true if pE1 is.
2aa40 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  ** true.  Return
2aa50 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e   false if we can
2aa60 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65  not complete the
2aa70 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32   proof or if pE2
2aa80 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c   might.** be fal
2aa90 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  se.  Examples:.*
2aaa0 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  *.**     pE1: x=
2aab0 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  =5       pE2: x=
2aac0 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
2aad0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2aae0 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20     pE1: x>0     
2aaf0 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
2ab00 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
2ab10 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2ab20 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45  1: x=21       pE
2ab30 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20  2: x=21 OR y=43 
2ab40 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2ab50 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
2ab60 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49  123     pE2: x I
2ab70 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2ab80 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
2ab90 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20    pE1: x!=?1    
2aba0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2abb0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
2abc0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2abd0 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a   x IS NULL  pE2:
2abe0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2abf0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
2ac00 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
2ac10 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53   ?2    pE2: x IS
2ac20 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75   NOT NULL    Reu
2ac30 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  slt: false.**.**
2ac40 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   When comparing 
2ac50 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2ac60 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20  between pE1 and 
2ac70 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a  pE2, if pE2 has.
2ac80 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30  ** Expr.iTable<0
2ac90 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74   then assume a t
2aca0 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65  able number give
2acb0 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  n by iTab..**.**
2acc0 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f   If pParse is no
2acd0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
2ace0 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64   values of bound
2acf0 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70 45   variables in pE
2ad00 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61 72  1 are .** compar
2ad10 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
2ad20 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45 32  al values in pE2
2ad30 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56 64   and pParse->pVd
2ad40 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a 2a  be->expmask is.*
2ad50 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72 65  * modified to re
2ad60 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e 64  cord which bound
2ad70 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 72   variables are r
2ad80 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20 70  eferenced.  If p
2ad90 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55 4c  Parse .** is NUL
2ada0 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77 69  L, then false wi
2adb0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 69  ll be returned i
2adc0 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20 61  f pE1 contains a
2add0 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ny bound variabl
2ade0 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  es..**.** When i
2adf0 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
2ae00 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
2ae10 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
2ae20 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
2ae30 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
2ae40 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
2ae50 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
2ae60 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
2ae70 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
2ae80 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
2ae90 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2aea0 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
2aeb0 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
2aec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2aed0 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72 73  ImpliesExpr(Pars
2aee0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2aef0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
2af00 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
2af10 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2af20 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 31  pare(pParse, pE1
2af30 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
2af40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2af50 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
2af60 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
2af70 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
2af80 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20  iesExpr(pParse, 
2af90 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
2afa0 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
2afb0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
2afc0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50  prImpliesExpr(pP
2afd0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e  arse, pE1, pE2->
2afe0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
2aff0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2b000 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2b010 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
2b020 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
2b030 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
2b040 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20  p!=TK_IS ){.    
2b050 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69 74  Expr *pX = sqlit
2b060 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2b070 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pE1->pLeft);. 
2b080 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
2b090 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  =pE1->pLeft );. 
2b0a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2b0b0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2b0c0 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74  , pX, pE2->pLeft
2b0d0 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , iTab)==0 ) ret
2b0e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2b0f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b100 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70 72  This is the Expr
2b110 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66   node callback f
2b120 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  or sqlite3ExprIm
2b130 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28  pliesNotNullRow(
2b140 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  )..** If the exp
2b150 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71  ression node req
2b160 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20 74  uires that the t
2b170 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d  able at pWalker-
2b180 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e  >iCur.** have on
2b190 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55  e or more non-NU
2b1a0 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  LL column, then 
2b1b0 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  set pWalker->eCo
2b1c0 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72  de to 1 and abor
2b1d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2b1e0 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61  utine controls a
2b1f0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2b200 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73   False positives
2b210 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61   (setting.** pWa
2b220 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31  lker->eCode to 1
2b230 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20   when it should 
2b240 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61 64  not be) are dead
2b250 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e 65  ly, but false-ne
2b260 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65  gatives.** (neve
2b270 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b 65  r setting pWalke
2b280 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20 68  r->eCode) is a h
2b290 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20 6f  armless missed o
2b2a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
2b2b0 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69  static int impli
2b2c0 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c  esNotNullRow(Wal
2b2d0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2b2e0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74 65  pr *pExpr){.  te
2b2f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b300 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2b310 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b320 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2b330 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
2b340 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2b350 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2b360 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
2b370 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77   WRC_Prune;.  sw
2b380 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2b390 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
2b3a0 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  SNOT:.    case T
2b3b0 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_NOT:.    case 
2b3c0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
2b3d0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
2b3e0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
2b3f0 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20  ase TK_CASE:.   
2b400 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
2b410 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
2b420 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
2b430 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b440 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
2b450 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b460 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20  >op==TK_NOT );. 
2b470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b480 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
2b490 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
2b4a0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b4b0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
2b4c0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b4d0 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
2b4e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b4f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
2b500 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
2b510 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b520 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  TK_IN );.      t
2b530 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b540 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2b550 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b560 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63  WRC_Prune;.    c
2b570 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
2b580 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
2b590 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d  ->u.iCur==pExpr-
2b5a0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
2b5b0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2b5c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  e = 1;.        r
2b5d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2b5f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2b600 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ..    /* Virtual
2b610 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f   tables are allo
2b620 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74  wed to use const
2b630 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55  raints like x=NU
2b640 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61  LL.  So.    ** a
2b650 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
2b660 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70  m x=y does not p
2b670 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e  rove that y is n
2b680 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20  ot null if x.   
2b690 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d   ** is the colum
2b6a0 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  n of a virtual t
2b6b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  able */.    case
2b6c0 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
2b6d0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
2b6e0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
2b6f0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
2b700 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
2b710 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65   TK_GE:.      te
2b720 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b730 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
2b740 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b750 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
2b760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b770 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2b780 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b790 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b7a0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
2b7b0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b7c0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
2b7d0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b7e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  r->op==TK_GE );.
2b7f0 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
2b800 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2b810 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
2b820 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ual(pExpr->pLeft
2b830 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20  ->y.pTab)).     
2b840 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69    || (pExpr->pRi
2b850 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
2b860 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2b870 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 79  pExpr->pRight->y
2b880 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b  .pTab)).      ){
2b890 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  .       return W
2b8a0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2b8b0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
2b8c0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b8d0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
2b8e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2b8f0 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
2b900 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61   expression p ca
2b910 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2b920 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  f at least.** on
2b930 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
2b940 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75  e iTab is non-nu
2b950 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ll.  In other wo
2b960 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
2b970 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f  .** if expressio
2b980 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  n p will always 
2b990 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
2b9a0 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   if every column
2b9b0 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2b9c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ULL..**.** False
2b9d0 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61   negatives are a
2b9e0 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f  cceptable.  In o
2b9f0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
2ba00 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a  s ok to return.*
2ba10 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65  * zero even if e
2ba20 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2ba30 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f   never be true o
2ba40 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2ba50 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2ba60 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  L.  A false nega
2ba70 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61  tive is merely a
2ba80 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2ba90 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  tion opportunity
2baa0 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f  ..**.** False po
2bab0 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20  sitives are not 
2bac0 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72  allowed, however
2bad0 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
2bae0 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ive may result.*
2baf0 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  * in an incorrec
2bb00 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20  t answer..**.** 
2bb10 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20  Terms of p that 
2bb20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20  are marked with 
2bb30 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64  EP_FromJoin (and
2bb40 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65   hence that come
2bb50 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20   from.** the ON 
2bb60 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2bb70 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20   of LEFT JOINS) 
2bb80 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
2bb90 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
2bba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2bbb0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
2bbc0 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f  eck if a LEFT JO
2bbd0 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  IN can be conver
2bbe0 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ted into.** an o
2bbf0 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54  rdinary JOIN.  T
2bc00 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73  he p argument is
2bc10 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2bc20 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45  e.  If the WHERE
2bc30 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69  .** clause requi
2bc40 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f  res that some co
2bc50 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68  lumn of the righ
2bc60 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c  t table of the L
2bc70 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e  EFT JOIN.** be n
2bc80 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
2bc90 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  e LEFT JOIN can 
2bca0 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72  be safely conver
2bcb0 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f  ted into an.** o
2bcc0 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f  rdinary join..*/
2bcd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2bce0 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2bcf0 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  w(Expr *p, int i
2bd00 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Tab){.  Walker w
2bd10 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2bd20 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74  ack = impliesNot
2bd30 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65  NullRow;.  w.xSe
2bd40 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2bd50 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2bd60 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
2bd70 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75  eCode = 0;.  w.u
2bd80 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  .iCur = iTab;.  
2bd90 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2bda0 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
2bdb0 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
2bdc0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2bdd0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2bde0 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2bdf0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2be00 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72  lker.** to deter
2be10 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65  mine if an expre
2be20 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61  ssion can be eva
2be30 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65  luated by refere
2be40 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  nce to the.** in
2be50 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75  dex only, withou
2be60 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61  t having to do a
2be70 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
2be80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
2be90 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54   table entry.  T
2bea0 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78  he IdxCover.pIdx
2beb0 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e   field is the in
2bec0 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69  dex.  IdxCover.i
2bed0 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75  Cur.** is the cu
2bee0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
2bef0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64  le..*/.struct Id
2bf00 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78  xCover {.  Index
2bf10 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54   *pIdx;     /* T
2bf20 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2bf30 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61  ested for covera
2bf40 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ge */.  int iCur
2bf50 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
2bf60 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2bf70 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
2bf80 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
2bf90 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ex */.};../*.** 
2bfa0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2bfb0 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65  there are refere
2bfc0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2bfd0 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61  in table .** pWa
2bfe0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2bff0 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73  r->iCur can be s
2c000 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74  atisfied using t
2c010 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c  he index.** pWal
2c020 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c030 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  ->pIdx..*/.stati
2c040 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76  c int exprIdxCov
2c050 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
2c060 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2c070 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2c080 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
2c090 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
2c0a0 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  ==pWalker->u.pId
2c0b0 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20  xCover->iCur.   
2c0c0 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  && sqlite3Column
2c0d0 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d  OfIndex(pWalker-
2c0e0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
2c0f0 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  dx, pExpr->iColu
2c100 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70  mn)<0.  ){.    p
2c110 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2c120 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  1;.    return WR
2c130 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
2c140 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2c150 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
2c160 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64  ermine if an ind
2c170 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65  ex pIdx on table
2c180 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
2c190 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a  r contains will.
2c1a0 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
2c1b0 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e  n pExpr.  Return
2c1c0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64   true if the ind
2c1d0 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68  ex does cover th
2c1e0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2c1f0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
2c200 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2c210 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62  n references tab
2c220 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68  le columns.** th
2c230 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64  at are not found
2c240 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49   in the index pI
2c250 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64  dx..**.** An ind
2c260 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65  ex covering an e
2c270 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20  xpression means 
2c280 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
2c290 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76  ion can be.** ev
2c2a0 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e  aluated using on
2c2b0 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ly the index and
2c2c0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
2c2d0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a  to lookup the.**
2c2e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2c2f0 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69  able entry..*/.i
2c300 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2c310 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20  veredByIndex(.  
2c320 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
2c330 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2c340 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f   to be tested */
2c350 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
2c360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2c370 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2c380 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2c390 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64  g table */.  Ind
2c3a0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2c3b0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
2c3c0 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  at might be used
2c3d0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2c3e0 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
2c3f0 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65    struct IdxCove
2c400 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74  r xcov;.  memset
2c410 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
2c420 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20  ));.  xcov.iCur 
2c430 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70  = iCur;.  xcov.p
2c440 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e  Idx = pIdx;.  w.
2c450 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2c460 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20  exprIdxCover;.  
2c470 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20  w.u.pIdxCover = 
2c480 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33  &xcov;.  sqlite3
2c490 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2c4a0 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77  pr);.  return !w
2c4b0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  .eCode;.}.../*.*
2c4c0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c4d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c4e0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2c4f0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2c500 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20  ker.** to count 
2c510 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
2c520 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ble columns in t
2c530 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  he arguments of 
2c540 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  an .** aggregate
2c550 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72   function, in or
2c560 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
2c570 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
2c580 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29  unctionThisSrc()
2c590 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
2c5a0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20  uct SrcCount {. 
2c5b0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2c5c0 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75    /* One particu
2c5d0 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  lar FROM clause 
2c5e0 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72  in a nested quer
2c5f0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73  y */.  int nThis
2c600 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c610 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2c620 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53  to columns in pS
2c630 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  rcList */.  int 
2c640 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20  nOther;      /* 
2c650 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2c660 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2c670 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  in other FROM cl
2c680 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  auses */.};../*.
2c690 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
2c6a0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2c6b0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  s to columns..*/
2c6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2c6d0 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20  SrcCount(Walker 
2c6e0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2c6f0 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65  pExpr){.  /* The
2c700 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20   NEVER() on the 
2c710 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62  second term is b
2c720 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75  ecause sqlite3Fu
2c730 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2c740 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61  c().  ** is alwa
2c750 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
2c760 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c770 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2c780 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20  and so the.  ** 
2c790 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20  TK_COLUMNs have 
2c7a0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e  not yet been con
2c7b0 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41  verted into TK_A
2c7c0 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20  GG_COLUMN.  If. 
2c7d0 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74   ** sqlite3Funct
2c7e0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2c7f0 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65   is used differe
2c800 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75  ntly in the futu
2c810 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56  re, the.  ** NEV
2c820 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74  ER() will need t
2c830 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  o be removed. */
2c840 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2c850 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e  ==TK_COLUMN || N
2c860 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  EVER(pExpr->op==
2c870 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29  TK_AGG_COLUMN) )
2c880 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2c890 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
2c8a0 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
2c8b0 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20  .pSrcCount;.    
2c8c0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
2c8d0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74  p->pSrc;.    int
2c8e0 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70   nSrc = pSrc ? p
2c8f0 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20  Src->nSrc : 0;. 
2c900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
2c910 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2c920 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2c930 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  e==pSrc->a[i].iC
2c940 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
2c950 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
2c960 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
2c970 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
2c980 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
2c990 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
2c9a0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2c9b0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2c9c0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2c9d0 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
2c9e0 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
2c9f0 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
2ca00 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
2ca10 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2ca20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
2ca30 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2ca40 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
2ca50 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
2ca60 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
2ca70 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
2ca80 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2ca90 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
2caa0 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
2cab0 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
2cac0 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
2cad0 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
2cae0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2caf0 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
2cb00 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
2cb10 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
2cb20 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2cb30 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
2cb40 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2cb50 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2cb60 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  ION );.  w.xExpr
2cb70 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
2cb80 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65  rcCount;.  w.xSe
2cb90 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2cba0 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
2cbb0 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
2cbc0 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
2cbd0 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
2cbe0 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
2cbf0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
2cc00 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
2cc10 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2cc20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
2cc30 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
2cc40 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
2cc50 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2cc60 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2cc70 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
2cc80 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2cc90 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2cca0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2ccb0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2ccc0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2ccd0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2cce0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
2ccf0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
2cd00 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
2cd10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
2cd20 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
2cd30 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2cd40 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
2cd50 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
2cd60 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2cd70 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
2cd80 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
2cd90 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
2cda0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2cdb0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
2cdc0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2cdd0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2cde0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
2cdf0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2ce00 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2ce10 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2ce20 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2ce30 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2ce40 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ce50 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
2ce60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2ce70 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2ce80 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2ce90 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
2cea0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2ceb0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
2cec0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
2ced0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2cee0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
2cef0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
2cf00 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
2cf10 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2cf20 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
2cf30 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
2cf40 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
2cf50 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
2cf60 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
2cf70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
2cf80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2cf90 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
2cfa0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2cfb0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
2cfc0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2cfd0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
2cfe0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2cff0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
2d000 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d010 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
2d020 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
2d030 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
2d040 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
2d050 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
2d060 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
2d070 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
2d080 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
2d090 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
2d0a0 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b  C->uNC.pAggInfo;
2d0b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ..  assert( pNC-
2d0c0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41  >ncFlags & NC_UA
2d0d0 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74  ggInfo );.  swit
2d0e0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2d0f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2d100 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
2d110 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
2d120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2d130 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2d140 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2d150 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2d160 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2d170 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
2d180 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2d190 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
2d1a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
2d1b0 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
2d1c0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
2d1d0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2d1e0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
2d1f0 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
2d200 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
2d210 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2d220 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
2d230 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
2d240 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
2d250 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2d260 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2d270 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2d280 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
2d290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d2a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d2b0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2d2c0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d2d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2d2e0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2d2f0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2d300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2d310 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2d320 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
2d330 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
2d340 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
2d350 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2d360 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
2d370 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2d380 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2d390 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
2d3a0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
2d3b0 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
2d3c0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
2d3d0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2d3e0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
2d3f0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2d400 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
2d410 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
2d420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d430 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
2d440 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
2d450 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
2d460 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
2d470 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
2d480 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
2d490 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
2d4a0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2d4b0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2d4c0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2d4d0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d4e0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2d4f0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2d500 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d520 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2d530 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d540 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
2d550 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
2d560 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
2d570 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
2d580 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2d590 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
2d5a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2d5b0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
2d5c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d5e0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
2d5f0 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
2d600 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
2d610 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
2d620 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
2d630 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2d640 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
2d650 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2d660 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
2d670 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d690 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2d6a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2d6b0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
2d6c0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2d6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
2d6e0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
2d6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d700 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
2d710 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2d720 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
2d730 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2d760 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
2d770 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
2d780 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
2d790 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2d7a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2d7b0 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
2d7c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d7d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2d7e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d800 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
2d810 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
2d820 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2d830 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2d840 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
2d850 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2d860 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d880 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2d890 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2d8a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d8b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2d8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d8e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d8f0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2d900 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
2d910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d920 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2d930 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
2d940 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
2d950 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
2d960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d980 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
2d990 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
2d9a0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
2d9b0 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
2d9c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
2d9d0 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
2d9e0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
2d9f0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
2da00 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
2da10 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
2da20 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
2da30 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
2da40 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
2da50 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
2da60 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
2da70 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
2da80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2da90 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2daa0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2dab0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2dac0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2dad0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2dae0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
2daf0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
2db00 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
2db10 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2db20 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
2db30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2db40 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
2db50 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
2db60 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2db70 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
2db80 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
2db90 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
2dba0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2dbb0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2dbc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2dbd0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
2dbe0 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
2dbf0 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
2dc00 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
2dc10 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
2dc20 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
2dc30 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
2dc40 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2dc50 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
2dc60 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
2dc70 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
2dc80 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
2dc90 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
2dca0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2dcb0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
2dcc0 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
2dcd0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2dce0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
2dcf0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
2dd00 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
2dd10 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2dd20 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
2dd30 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2dd40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2dd50 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d  Compare(0, pItem
2dd60 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
2dd70 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2dd80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dd90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dda0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2ddb0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
2ddc0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
2ddd0 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
2dde0 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
2ddf0 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
2de00 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
2de10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2de20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
2de30 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
2de40 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
2de50 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
2de60 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
2de70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2de80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2de90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2dea0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2deb0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2dec0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2ded0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
2dee0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
2def0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2df00 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2df10 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2df20 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2df30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2df40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2df50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2df60 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
2df70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2df80 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
2df90 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
2dfa0 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfc0 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
2dfd0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
2dfe0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
2dff0 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
2e000 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
2e010 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
2e020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2e030 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
2e040 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2e050 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2e060 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
2e070 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2e0a0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2e0b0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2e0c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2e0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e0e0 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
2e0f0 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
2e100 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
2e110 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
2e120 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e130 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2e140 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2e150 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2e160 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2e170 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2e180 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2e190 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2e1a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2e1b0 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
2e1c0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2e1d0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2e1e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2e1f0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2e200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2e210 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2e220 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2e230 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2e240 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2e250 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2e260 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2e270 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
2e280 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2e290 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2e2a0 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2e2b0 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2e2c0 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20  alkerDepth++;.  
2e2d0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2e2e0 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  nue;.}.static vo
2e2f0 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  id analyzeAggreg
2e300 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28  atesInSelectEnd(
2e310 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2e320 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2e330 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e340 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2e350 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2e360 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  rDepth--;.}../*.
2e370 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
2e380 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2e390 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
2e3a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2e3b0 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
2e3c0 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
2e3d0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
2e3e0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
2e3f0 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
2e400 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
2e410 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
2e420 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
2e430 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
2e440 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
2e450 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e460 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
2e470 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
2e480 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2e490 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
2e4a0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
2e4b0 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
2e4c0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2e4d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e4e0 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
2e4f0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
2e500 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
2e510 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2e520 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2e530 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
2e540 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2e550 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e560 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78  sInSelect;.  w.x
2e570 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2e580 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2e590 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a  tesInSelectEnd;.
2e5a0 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20    w.walkerDepth 
2e5b0 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  = 0;.  w.u.pNC =
2e5c0 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
2e5d0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
2e5e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
2e5f0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2e600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
2e610 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2e620 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
2e630 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
2e640 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
2e650 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
2e660 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2e670 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
2e680 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
2e690 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
2e6a0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
2e6b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2e6c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e6d0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
2e6e0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
2e6f0 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
2e700 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2e710 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
2e720 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2e730 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
2e740 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
2e750 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2e760 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e770 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2e780 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
2e790 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
2e7a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2e7b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2e7c0 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
2e7d0 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
2e7e0 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
2e7f0 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
2e800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2e810 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2e820 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
2e830 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
2e840 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2e850 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
2e870 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
2e880 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e890 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
2e8a0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
2e8b0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
2e8c0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
2e8d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
2e8e0 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64  purpose..*/.void
2e8f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2e900 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2e910 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
2e920 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
2e930 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
2e940 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
2e950 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
2e960 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
2e970 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
2e980 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
2e990 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2e9a0 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
2e9b0 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
2e9c0 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
2e9d0 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e  registers..*/.in
2e9e0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2e9f0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2ea00 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
2ea10 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
2ea20 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75  ( nReg==1 ) retu
2ea30 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  rn sqlite3GetTem
2ea40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2ea50 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
2ea60 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
2ea70 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
2ea80 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
2ea90 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2eaa0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
2eab0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2eac0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
2ead0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
2eae0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2eaf0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2eb00 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
2eb10 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
2eb20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2eb30 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2eb40 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2eb50 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2eb60 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
2eb70 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2eb80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2eb90 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72  iReg);.    retur
2eba0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  n;.  }.  if( nRe
2ebb0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2ebc0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2ebd0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2ebe0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2ebf0 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2ec00 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2ec10 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2ec20 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2ec30 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2ec40 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2ec50 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2ec60 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2ec70 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2ec80 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2ec90 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2eca0 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2ecb0 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2ecc0 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2ecd0 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2ece0 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2ecf0 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2ed00 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2ed10 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2ed20 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2ed30 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2ed40 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2ed50 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ed60 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2ed70 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2ed80 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2ed90 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2eda0 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2edb0 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2edc0 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2edd0 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2ede0 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2edf0 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a  ngeReg > iFirst.
2ee00 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2ee10 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74  angeReg <= iLast
2ee20 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
2ee30 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
2ee40 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
2ee50 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
2ee60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
2ee70 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
2ee80 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
2ee90 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
2eea0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2eeb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2eec0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2eed0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2eee0 47 20 2a 2f 0a                                   G */.