/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 18f8875c247ef5491826619d7ad1d5a67a7a370d76d92066761bd3c015a2d16b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 7c 28 69 56 61 6c 75 65 3f 45 50 5f 49 73 54  f|(iValue?EP_IsT
66b0: 72 75 65 3a 45 50 5f 49 73 46 61 6c 73 65 29 3b  rue:EP_IsFalse);
66c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66d0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6700: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6710: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
6720: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6730: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6740: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6750: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6760: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6770: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6780: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6790: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
67a0: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
67b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
67c0: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67d0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6800: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
6810: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
6820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6830: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6840: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6850: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6860: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6870: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6880: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6890: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68a0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68b0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68c0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68d0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68e0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
68f0: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6900: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6910: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6920: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6930: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6940: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6950: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6960: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6970: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6980: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6990: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69a0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69c0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69d0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
69f0: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a00: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a10: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a30: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a40: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a50: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a60: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a70: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a80: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6a90: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6aa0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ab0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ac0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ad0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6ae0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6af0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b00: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b10: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b20: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b30: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b40: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b50: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b60: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6b90: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bb0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6bd0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6bf0: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c00: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c10: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c20: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c40: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c50: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cb0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cc0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6cd0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6ce0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6cf0: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d00: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d10: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d20: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d40: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d50: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d60: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d70: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d80: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6d90: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6da0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6db0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dc0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6dd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6df0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e60: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6e90: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 70 20 3d    Expr *p;.  p =
6ea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6eb0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6ec0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6ed0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6ee0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
6ef0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6f00: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 30 78 66  p->op = op & 0xf
6f10: 66 3b 0a 20 20 20 20 70 2d 3e 69 41 67 67 20 3d  f;.    p->iAgg =
6f20: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
6f30: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6f40: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
6f50: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f70: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
6f80: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
6f90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
6fa0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
6fc0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
6fd0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6fe0: 65 2d 3e 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  e->db, pRight);.
6ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7000: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7010: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
7020: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
7030: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
7040: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
7050: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
7060: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
7070: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7080: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
70a0: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
70b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
70c0: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
70d0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
70e0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
70f0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7100: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7110: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7120: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
7130: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
7140: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7150: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7160: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
7170: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
71a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
71b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
71c0: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
71d0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  .  }.}.../*.** J
71e0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
71f0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7200: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7210: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7220: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7230: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7240: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7250: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7260: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7270: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7280: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7290: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
72a0: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
72b0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
72c0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
72d0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
72e0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
72f0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7300: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7310: 45 78 70 72 41 6e 64 28 50 61 72 73 65 20 2a 70  ExprAnd(Parse *p
7320: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c 65  Parse, Expr *pLe
7330: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
7340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7350: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7360: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 20 29   if( pLeft==0  )
7370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
7380: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
7390: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
73a0: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
73b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
73c0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 52  se->nErr || IN_R
73d0: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
73e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
73f0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
7400: 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70  TK_AND, pLeft, p
7410: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20  Right);.  }else 
7420: 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46 61  if( ExprAlwaysFa
7430: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 45 78  lse(pLeft) || Ex
7440: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
7450: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
7460: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7470: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
7480: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7490: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
74a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
74b0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
74c0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
74d0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
74e0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
74f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
7500: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7510: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
7520: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
7530: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
7540: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
7550: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
7560: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7570: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7580: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7590: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
75a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
75b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
75c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
75d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
75e0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
75f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7600: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
7610: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7620: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
7630: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
7640: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
7650: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
7660: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7670: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7680: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7690: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
76a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
76b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
76c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76d0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7700: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7710: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7720: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7730: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7750: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
7760: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7770: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7780: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7790: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
77a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
77b0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
77c0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
77d0: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
77e0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
77f0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7800: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
7810: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
7820: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
7830: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7840: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
7850: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
7860: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7870: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7880: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
7890: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
78a0: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
78b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
78c0: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
78d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
78e0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
78f0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7900: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7910: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7920: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7930: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7940: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7950: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7960: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7970: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7980: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7990: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
79a0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
79b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
79c0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
79d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
79e0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
79f0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7a00: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7a10: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7a20: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7a30: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7a40: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7a50: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7a60: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7a70: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a80: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a90: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7aa0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7ab0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7ac0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7ad0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7ae0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7af0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7b00: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7b10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7b20: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7b30: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7b40: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7b50: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7b60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7b70: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b90: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7ba0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7bb0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7bd0: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7be0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7bf0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7c00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7c10: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7c20: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7c30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7c40: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7c50: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7c60: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7c70: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c80: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7c90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7ca0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7cb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7cc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7cd0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7ce0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7cf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7d00: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7d10: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7d20: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7d30: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7d40: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7d50: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7d60: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7d70: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7d80: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7d90: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7da0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7db0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7dc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7dd0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7de0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7df0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7e00: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7e10: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7e20: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7e30: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7e40: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7e50: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7e60: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7e70: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7e80: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7e90: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7ea0: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7eb0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7ed0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7ee0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7ef0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7f00: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f30: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7f40: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7f50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7f60: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7f70: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7f80: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7f90: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7fa0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7fb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7fc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7fd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7fe0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ff0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
8000: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
8010: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
8020: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8030: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8040: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
8050: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
8060: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8070: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
8080: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
8090: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
80a0: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
80b0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
80c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
80d0: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
80e0: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
80f0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8100: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8110: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8130: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
8140: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8150: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8160: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8170: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8180: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8190: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
81a0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
81b0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
81c0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
81d0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
81e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
81f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8200: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8210: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8220: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8230: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8240: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8260: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8270: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8280: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8290: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
82a0: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
82b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
82c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
82d0: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
82e0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
82f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8300: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8310: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8320: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8330: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8340: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8350: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8360: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8370: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8390: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
83a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
83b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
83c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
83d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
83e0: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
83f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8400: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8410: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8420: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8430: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
8440: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8450: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8460: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8470: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8480: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8490: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
84a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
84b0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
84c0: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
84d0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
84e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
84f0: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8500: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
8510: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8520: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
8530: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
8540: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
8550: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
8560: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
8570: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
8580: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
8590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
85a0: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
85b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
85c0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
85d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
85e0: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
85f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8600: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
8610: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
8620: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
8630: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
8640: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
8650: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8660: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
8670: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8680: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8690: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
86a0: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
86b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
86c0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
86d0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
86e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
86f0: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
8700: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
8710: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8720: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
8730: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
8740: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
8750: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8760: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
8770: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
8780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8790: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
87a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
87b0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
87c0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
87d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
87f0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
8800: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
8810: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8820: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8830: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nc) ){.      ass
8840: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
8850: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
8860: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
8870: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79 2e 70 57  lete(db, p->y.pW
8880: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  in);.    }.  }. 
8890: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
88a0: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
88b0: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
88c0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
88d0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
88e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88f0: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
8900: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8910: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
8920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8930: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
8940: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8950: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8960: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8970: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8980: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8990: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
89a0: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
89b0: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
89c0: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
89d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
89e0: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
89f0: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8a00: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8a10: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8a20: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a40: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
8a50: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8a60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8a70: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8a80: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8a90: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8aa0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8ab0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8ac0: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8ad0: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8ae0: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8af0: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  IZE;.}../*.** Co
8b00: 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
8b10: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 45 78  content of an Ex
8b20: 70 72 20 6e 6f 64 65 2c 20 74 61 6b 69 6e 67 20  pr node, taking 
8b30: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
8b40: 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64  .** past the end
8b50: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
8b60: 65 20 66 6f 72 20 61 20 72 65 64 75 63 65 64 2d  e for a reduced-
8b70: 73 69 7a 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  size version of 
8b80: 74 68 65 20 73 6f 75 72 63 65 0a 2a 2a 20 45 78  the source.** Ex
8b90: 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pr..*/.static vo
8ba0: 69 64 20 65 78 70 72 4e 6f 64 65 43 6f 70 79 28  id exprNodeCopy(
8bb0: 45 78 70 72 20 2a 70 44 65 73 74 2c 20 45 78 70  Expr *pDest, Exp
8bc0: 72 20 2a 70 53 72 63 29 7b 0a 20 20 6d 65 6d 73  r *pSrc){.  mems
8bd0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 73 69 7a  et(pDest, 0, siz
8be0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
8bf0: 6d 63 70 79 28 70 44 65 73 74 2c 20 70 53 72 63  mcpy(pDest, pSrc
8c00: 2c 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  , exprStructSize
8c10: 28 70 53 72 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pSrc));.}../*.*
8c20: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a  * The dupedExpr*
8c30: 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20  Size() routines 
8c40: 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20  each return the 
8c50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8c60: 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73  required.** to s
8c70: 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61  tore a copy of a
8c80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20  n expression or 
8c90: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8ca0: 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e    They differ in
8cb0: 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  .** how much of 
8cc0: 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73  the tree is meas
8cd0: 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ured..**.**     
8ce0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8cf0: 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f  ize()     Size o
8d00: 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20  f only the Expr 
8d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20  structure .**   
8d20: 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53    dupedExprNodeS
8d30: 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65  ize()       Size
8d40: 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65   of Expr + space
8d50: 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20   for token.**   
8d60: 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28    dupedExprSize(
8d70: 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72  )           Expr
8d80: 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72   + token + subtr
8d90: 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a  ee components.**
8da0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8df0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8e00: 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e  StructSize() fun
8e10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77  ction returns tw
8e20: 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74  o values OR-ed t
8e30: 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31  ogether:  .** (1
8e40: 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  ) the space requ
8e50: 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20  ired for a copy 
8e60: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
8e70: 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a  cture only and .
8e80: 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78  ** (2) the EP_xx
8e90: 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64  x flags that ind
8ea0: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73  icate what the s
8eb0: 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68  tructure size sh
8ec0: 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20  ould be..** The 
8ed0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73  return values is
8ee0: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a   always one of:.
8ef0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  **.**      EXPR_
8f00: 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20  FULLSIZE.**     
8f10: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8f20: 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64  E   | EP_Reduced
8f30: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f  .**      EXPR_TO
8f40: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50  KENONLYSIZE | EP
8f50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a  _TokenOnly.**.**
8f60: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8f70: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
8f80: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
8f90: 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
8fa0: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72  lue.** of this r
8fb0: 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66  outine with 0xff
8fc0: 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61  f.  The flags ca
8fd0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
8fe0: 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74  sking the.** ret
8ff0: 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45  urn value with E
9000: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
9010: 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  enOnly..**.** No
9020: 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61  te that with fla
9030: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9040: 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  CE, this routine
9050: 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d  s works on full-
9060: 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63  size.** (unreduc
9070: 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73  ed) Expr objects
9080: 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67   as they or orig
9090: 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74  inally construct
90a0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
90b0: 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72  ..** During expr
90c0: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c  ession analysis,
90d0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
90e0: 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  on is computed a
90f0: 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a  nd moved into.**
9100: 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20   later parts of 
9110: 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74 20  the Expr object 
9120: 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69  and that extra i
9130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74  nformation might
9140: 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20   get chopped.** 
9150: 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65  off if the expre
9160: 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64  ssion is reduced
9170: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
9180: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f  t it does not wo
9190: 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e  rk to.** make an
91a0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
91b0: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
91c0: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
91d0: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
91e0: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
91f0: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
9200: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
9210: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
9220: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
9230: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
9240: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
9250: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
9260: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
9270: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
9280: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
9290: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
92a0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
92b0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
92c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
92d0: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
92e0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
92f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
9300: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
9310: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
9320: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
9330: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
9340: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
9350: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
9360: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
9370: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
9380: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c  0 );.  if( 0==fl
9390: 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ags || p->op==TK
93a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a  _SELECT_COLUMN .
93b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
93c0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
93d0: 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70    || ExprHasProp
93e0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
93f0: 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  nc).#endif.  ){.
9400: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9410: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
9420: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9430: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9440: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
9450: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
9460: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9470: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9480: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
9490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94b0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
94c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
94d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
94e0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
94f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
9500: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
9510: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
9520: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
9530: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
9540: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9550: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9560: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
9570: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
9580: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
9590: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
95a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
95b0: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
95c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
95d0: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
95e0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
95f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
9600: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
9610: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
9620: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9630: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
9640: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
9650: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
9660: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
9670: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9680: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9690: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
96a0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
96b0: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
96c0: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
96d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
96e0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
96f0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
9700: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
9710: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9720: 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  0NN(p->u.zToken)
9730: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
9740: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
9750: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9760: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9770: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9780: 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61  create a duplica
9790: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78  te of the .** ex
97a0: 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
97b0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
97c0: 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e  ument. The secon
97d0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  d argument is a.
97e0: 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69  ** mask containi
97f0: 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  ng EXPRDUP_XXX f
9800: 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
9810: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
9820: 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f  ncludes space to
9830: 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
9840: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9850: 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20  t.** itself and 
9860: 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72  the buffer refer
9870: 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75  red to by Expr.u
9880: 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e  .zToken, if any.
9890: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
98a0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
98b0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
98c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
98d0: 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61  includes .** spa
98e0: 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  ce to duplicate 
98f0: 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69  all Expr nodes i
9900: 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65  n the tree forme
9910: 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20  d by Expr.pLeft 
9920: 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69  .** and Expr.pRi
9930: 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62  ght variables (b
9940: 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73  ut not for any s
9950: 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65  tructures pointe
9960: 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63  d to or .** desc
9970: 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45  ended from the E
9980: 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45  xpr.x.pList or E
9990: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61  xpr.x.pSelect va
99a0: 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61  riables)..*/.sta
99b0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
99c0: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  rSize(Expr *p, i
99d0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
99e0: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66   nByte = 0;.  if
99f0: 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ( p ){.    nByte
9a00: 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65   = dupedExprNode
9a10: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
9a20: 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58      if( flags&EX
9a30: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a  PRDUP_REDUCE ){.
9a40: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64        nByte += d
9a50: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
9a60: 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20  pLeft, flags) + 
9a70: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9a80: 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b  >pRight, flags);
9a90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9aa0: 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a  urn nByte;.}../*
9ab0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9ac0: 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
9ad0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29  sqlite3ExprDup()
9ae0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66  , except that if
9af0: 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73   pzBuffer .** is
9b00: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a   not NULL then *
9b10: 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75  pzBuffer is assu
9b20: 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  med to point to 
9b30: 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
9b40: 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f  nough .** to sto
9b50: 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65  re the copy of e
9b60: 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65  xpression p, the
9b70: 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e   copies of p->u.
9b80: 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70  zToken.** (if ap
9b90: 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74  plicable), and t
9ba0: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  he copies of the
9bb0: 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d   p->pLeft and p-
9bc0: 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69  >pRight expressi
9bd0: 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20  ons,.** if any. 
9be0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
9bf0: 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73  , *pzBuffer is s
9c00: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
9c10: 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a  byte past the.**
9c20: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
9c30: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
9c40: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
9c50: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
9c60: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
9c70: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
9c80: 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c  p, int dupFlags,
9c90: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
9ca0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
9cc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
9cd0: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20   u8 *zAlloc;    
9ce0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9cf0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63   space from whic
9d00: 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20  h to build Expr 
9d10: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
9d20: 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20  staticFlag;     
9d30: 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69    /* EP_Static i
9d40: 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61  f space not obta
9d50: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
9d60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64   */..  assert( d
9d70: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
9d80: 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( p );.  assert(
9d90: 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20   dupFlags==0 || 
9da0: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
9db0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73  P_REDUCE );.  as
9dc0: 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d  sert( pzBuffer==
9dd0: 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45  0 || dupFlags==E
9de0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
9df0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
9e00: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
9e10: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
9e20: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66  ructure. */.  if
9e30: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
9e40: 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75    zAlloc = *pzBu
9e50: 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63  ffer;.    static
9e60: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
9e70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9e80: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
9e90: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
9ea0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9eb0: 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20  , dupFlags));.  
9ec0: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30    staticFlag = 0
9ed0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28  ;.  }.  pNew = (
9ee0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
9ef0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9f00: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
9f10: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
9f20: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
9f30: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
9f40: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70  d to.    ** by p
9f50: 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74  New. This is eit
9f60: 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  her EXPR_FULLSIZ
9f70: 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  E, EXPR_REDUCEDS
9f80: 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58  IZE or.    ** EX
9f90: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9fa0: 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20  . nToken is set 
9fb0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9fc0: 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a   bytes consumed.
9fd0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
9fe0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
9ff0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
a000: 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
a010: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
a020: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
a030: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
a040: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b  ze(p, dupFlags);
a050: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
a060: 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63  NewSize = nStruc
a070: 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20  tSize & 0xfff;. 
a080: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20     int nToken;. 
a090: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a0a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
a0b0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
a0c0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
a0d0: 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  nToken = sqlite3
a0e0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
a0f0: 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d  oken) + 1;.    }
a100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  else{.      nTok
a110: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  en = 0;.    }.  
a120: 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29    if( dupFlags )
a130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a140: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a150: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
a160: 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 );.      memcp
a170: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
a180: 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  wSize);.    }els
a190: 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69  e{.      u32 nSi
a1a0: 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74  ze = (u32)exprSt
a1b0: 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20  ructSize(p);.   
a1c0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a1d0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
a1e0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50     if( nSize<EXP
a1f0: 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20  R_FULLSIZE ){ . 
a200: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
a210: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
a220: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
a230: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
a240: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
a250: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
a260: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
a270: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
a280: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
a290: 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66  . */.    pNew->f
a2a0: 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64  lags &= ~(EP_Red
a2b0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a2c0: 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d  y|EP_Static|EP_M
a2d0: 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e  emToken);.    pN
a2e0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
a2f0: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
a300: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a310: 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nly);.    pNew->
a320: 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46  flags |= staticF
a330: 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  lag;..    /* Cop
a340: 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  y the p->u.zToke
a350: 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79  n string, if any
a360: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f  . */.    if( nTo
a370: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ken ){.      cha
a380: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
a390: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
a3a0: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
a3b0: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  Size];.      mem
a3c0: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
a3d0: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
a3e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
a3f0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
a400: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45  New->flags) & (E
a410: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a420: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f  eaf)) ){.      /
a430: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
a440: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
a450: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
a460: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
a470: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a480: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
a490: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
a4a0: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a4b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a4c0: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
a4d0: 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ect, dupFlags);.
a4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a4f0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
a500: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a510: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
a520: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
a530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a540: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
a550: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
a560: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
a570: 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
a580: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a590: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a5a0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46 75  kenOnly|EP_WinFu
a5b0: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  nc) ){.      zAl
a5c0: 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72  loc += dupedExpr
a5d0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46  NodeSize(p, dupF
a5e0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
a5f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a600: 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e  y(pNew, EP_Token
a610: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a620: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a630: 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20  Left = p->pLeft 
a640: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
a650: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a660: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
a670: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a680: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a690: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
a6a0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20   = p->pRight ?. 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a6d0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50  , p->pRight, EXP
a6e0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a6f0: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a700: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a710: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
a720: 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  C.      if( Expr
a730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a740: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
a750: 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57        pNew->y.pW
a760: 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  in = sqlite3Wind
a770: 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20  owDup(db, pNew, 
a780: 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20  p->y.pWin);.    
a790: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a7a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a7b0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  , EP_WinFunc) );
a7c0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a7d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a7e0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a7f0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
a800: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75  ){.        *pzBu
a810: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
a820: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a830: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  {.      if( !Exp
a840: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a850: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a860: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
a870: 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54   if( pNew->op==T
a880: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
a890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
a8a0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
a8b0: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  eft;.          a
a8c0: 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d  ssert( p->iColum
a8d0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
a8e0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
a8f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
a900: 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52  ght==0  || p->pR
a910: 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29  ight==p->pLeft )
a920: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a930: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a940: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
a950: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
a960: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
a970: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77    }.        pNew
a980: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
a990: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
a9a0: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
a9b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a9c0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
a9d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
a9e0: 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20  d return a deep 
a9f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65  copy of the obje
aa00: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aa10: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
aa20: 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ment. If an OOM 
aa30: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63  condition is enc
aa40: 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69  ountered, NULL i
aa50: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
aa60: 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  d the db->malloc
aa70: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e  Failed flag set.
aa80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
aa90: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74  TE_OMIT_CTE.stat
aaa0: 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70  ic With *withDup
aab0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
aac0: 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a  th *p){.  With *
aad0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
aae0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
aaf0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
ab00: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
ab10: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
ab20: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
ab30: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
ab40: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ab50: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
ab60: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
ab70: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
ab80: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
ab90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
aba0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
abb0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
abc0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
abd0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
abe0: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
abf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
ac00: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
ac10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ac20: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
ac30: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
ac40: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
ac50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ac60: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
ac70: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
ac80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ac90: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
aca0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
acb0: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
acc0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
acd0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
ace0: 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74 68  C./*.** The gath
acf0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
ad00: 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64 20  ) procedure and 
ad10: 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69  its helper routi
ad20: 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c 65  ne.** gatherSele
ad30: 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63  ctWindowsCallbac
ad40: 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f 20  k() are used to 
ad50: 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  scan all the exp
ad60: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20 61  ressions.** an a
ad70: 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74 65   newly duplicate
ad80: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
ad90: 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61 6c  nt and gather al
ada0: 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 0a  l of the Window.
adb0: 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e 64  ** objects found
adc0: 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c 69   there, assembli
add0: 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68 65  ng them onto the
ade0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74 20   linked list at 
adf0: 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a 2f  Select->pWin..*/
ae00: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
ae10: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
ae20: 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a  allback(Walker *
ae30: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
ae40: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
ae50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
ae60: 49 4f 4e 20 26 26 20 70 45 78 70 72 2d 3e 79 2e  ION && pExpr->y.
ae70: 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 61  pWin!=0 ){.    a
ae80: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
ae90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
aea0: 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20 20  _WinFunc) );.   
aeb0: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e   pExpr->y.pWin->
aec0: 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61 6c 6b  pNextWin = pWalk
aed0: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70  er->u.pSelect->p
aee0: 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b 65 72  Win;.    pWalker
aef0: 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69  ->u.pSelect->pWi
af00: 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57 69  n = pExpr->y.pWi
af10: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
af20: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
af30: 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68 65  static int gathe
af40: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
af50: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57 61 6c  lectCallback(Wal
af60: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
af70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 74 75  lect *p){.  retu
af80: 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  rn p==pWalker->u
af90: 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43 5f 43  .pSelect ? WRC_C
afa0: 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f 50 72  ontinue : WRC_Pr
afb0: 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  une;.}.static vo
afc0: 69 64 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  id gatherSelectW
afd0: 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20 2a 70  indows(Select *p
afe0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
aff0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
b000: 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74 57   = gatherSelectW
b010: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 3b 0a  indowsCallback;.
b020: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b030: 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65  ack = gatherSele
b040: 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43  ctWindowsSelectC
b050: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b060: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
b070: 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  0;.  w.pParse = 
b080: 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65 63 74  0;.  w.u.pSelect
b090: 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57   = p;.  sqlite3W
b0a0: 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 29  alkSelect(&w, p)
b0b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
b0c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b0d0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
b0e0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
b0f0: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
b100: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
b110: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
b120: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
b130: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
b140: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
b150: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
b160: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
b170: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
b180: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
b190: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
b1a0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
b1b0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
b1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
b1d0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
b1e0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
b1f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b200: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
b210: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
b220: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
b230: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
b240: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
b250: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
b260: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
b270: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
b280: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
b290: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
b2a0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
b2b0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
b2c0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
b2d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
b2e0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
b2f0: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
b300: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
b310: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
b320: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
b330: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
b340: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
b350: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
b360: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
b370: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
b380: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
b390: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
b3a0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
b3b0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
b3c0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b3d0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b3e0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
b3f0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
b400: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b410: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
b420: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
b430: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
b440: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
b450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
b460: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
b470: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
b480: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
b490: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
b4a0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
b4b0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b4c0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b4d0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
b4e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b4f0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b500: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b510: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b520: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b530: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b540: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b550: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b560: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b570: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b580: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b590: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b5a0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b5b0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b5c0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b5d0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b5e0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b5f0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b600: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b610: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b620: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b630: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b640: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b650: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b660: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b670: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b680: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b690: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b6a0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b6b0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b6c0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b6d0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b6e0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b6f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b700: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b710: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b720: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b730: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b740: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b750: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b760: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b770: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b780: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b790: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b7a0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b7b0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b7c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b7d0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b7e0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b7f0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b810: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b820: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b830: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b850: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b860: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b870: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b880: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b890: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b8a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b8b0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b8c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b8d0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b8e0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b8f0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b900: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b910: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b920: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b930: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b940: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b950: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b960: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b970: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b980: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b990: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62  ab;.    pItem->b
b9a0: 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64  SorterRef = pOld
b9b0: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b9c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
b9d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
b9e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
b9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
ba00: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
ba10: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
ba20: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
ba30: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
ba40: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
ba50: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
ba60: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
ba70: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
ba80: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
ba90: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
baa0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
bab0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
bac0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
bad0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
bae0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
baf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
bb00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bb10: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
bb20: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
bb30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
bb40: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
bb50: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
bb60: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
bb70: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
bb80: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
bb90: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
bba0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
bbb0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
bbc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
bbd0: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
bbe0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
bbf0: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
bc00: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
bc10: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
bc20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bc30: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bc40: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
bc50: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
bc60: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
bc70: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
bc80: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
bc90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
bca0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
bcb0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
bcc0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
bcd0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
bce0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
bcf0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
bd00: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
bd10: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
bd20: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
bd30: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
bd40: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
bd50: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
bd60: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bd70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
bd80: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
bd90: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bda0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bdb0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bdc0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
bdd0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
bde0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bdf0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
be00: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66  .    pNewItem->f
be10: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67  g = pOldItem->fg
be20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
be30: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
be40: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
be50: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
be60: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
be70: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
be80: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
be90: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
bea0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
beb0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
bec0: 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
bed0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
bee0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
bef0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
bf00: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bf10: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
bf20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
bf30: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  tem->pIBIndex = 
bf40: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pOldItem->pIBInd
bf50: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ex;.    if( pNew
bf60: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
bf70: 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nc ){.      pNew
bf80: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
bf90: 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  g = .          s
bfa0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bfb0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bfc0: 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61  u1.pFuncArg, fla
bfd0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  gs);.    }.    p
bfe0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
bff0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
c000: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
c010: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
c020: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
c030: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
c040: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
c050: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
c060: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
c070: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
c080: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
c090: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c0a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
c0b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c0c0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
c0d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
c0e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c0f0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
c100: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
c110: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
c120: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
c130: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
c140: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
c150: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
c160: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
c170: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
c180: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
c190: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
c1a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c1b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
c1c0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c1d0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
c1e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
c1f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
c200: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
c210: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
c220: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c230: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
c240: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
c250: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
c260: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
c270: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77  bFreeNN(db, pNew
c280: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c290: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
c2a0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
c2b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
c2c0: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
c2d0: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
c2e0: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
c2f0: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
c300: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
c310: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
c320: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
c330: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
c340: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
c350: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
c360: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
c370: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c380: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
c390: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
c3a0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
c3b0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
c3c0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
c3d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
c3e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c3f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c400: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
c410: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
c420: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
c430: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
c440: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
c450: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
c460: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
c470: 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Dup, int flags){
c480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20  .  Select *pRet 
c490: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = 0;.  Select *p
c4a0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Next = 0;.  Sele
c4b0: 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ct **pp = &pRet;
c4c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20  .  Select *p;.. 
c4d0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c4e0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20  ;.  for(p=pDup; 
c4f0: 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b  p; p=p->pPrior){
c500: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
c510: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c520: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c530: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69  eof(*p) );.    i
c540: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65  f( pNew==0 ) bre
c550: 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  ak;.    pNew->pE
c560: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
c570: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c580: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
c590: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  .    pNew->pSrc 
c5a0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
c5b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
c5c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c5d0: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
c5e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c5f0: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
c600: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f  ;.    pNew->pGro
c610: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
c620: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c630: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
c640: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61  );.    pNew->pHa
c650: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
c660: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
c670: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
c680: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
c690: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c6a0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
c6b0: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
c6c0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d     pNew->op = p-
c6d0: 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  >op;.    pNew->p
c6e0: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
c6f0: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
c700: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c   0;.    pNew->pL
c710: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
c720: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
c730: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  mit, flags);.   
c740: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
c750: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66  0;.    pNew->iOf
c760: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
c770: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
c780: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
c790: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
c7a0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c7b0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
c7c0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70      pNew->addrOp
c7d0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
c7e0: 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63      pNew->nSelec
c7f0: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
c800: 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  tRow;.    pNew->
c810: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
c820: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23  db, p->pWith);.#
c830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c840: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
c850: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30    pNew->pWin = 0
c860: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  ;.    pNew->pWin
c870: 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69  Defn = sqlite3Wi
c880: 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20  ndowListDup(db, 
c890: 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20  p->pWinDefn);.  
c8a0: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 20    if( p->pWin ) 
c8b0: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
c8c0: 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64 69  ows(pNew);.#endi
c8d0: 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49  f.    pNew->selI
c8e0: 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20  d = p->selId;.  
c8f0: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c900: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c910: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c920: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c930: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c940: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c950: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c960: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c970: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c980: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c990: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c9a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c9b0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c9c0: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c9d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c9e0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c9f0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
ca00: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
ca10: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
ca20: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
ca30: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
ca40: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
ca50: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
ca60: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
ca70: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
ca80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
ca90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
caa0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
cab0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
cac0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
cad0: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
cae0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
caf0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
cb00: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
cb10: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
cb20: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
cb30: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
cb40: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
cb50: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
cb60: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
cb70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cb80: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
cb90: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
cba0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
cbb0: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
cbc0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
cbd0: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
cbe0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
cbf0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
cc00: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
cc10: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
cc20: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
cc30: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
cc40: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
cc50: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
cc60: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
cc70: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
cc80: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
cc90: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
cca0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
ccb0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
ccc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ccd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
cce0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ccf0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd00: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
cd10: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
cd20: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
cd30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
cd40: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
cd50: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
cd60: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
cd70: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
cd80: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
cd90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
cda0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cdb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cdc0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
cdd0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
cde0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
cdf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
ce00: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
ce10: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
ce20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
ce30: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
ce40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
ce50: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
ce60: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
ce70: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
ce80: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
ce90: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
cea0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
ceb0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
cec0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
ced0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
cee0: 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c 69 74  pList)+(2*(sqlit
cef0: 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74 2d 3e  e3_int64)pList->
cf00: 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f 66 28  nExpr-1)*sizeof(
cf10: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
cf20: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
cf30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
cf40: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
cf50: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
cf60: 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
cf70: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
cf80: 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r++];.  assert( 
cf90: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cfa0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
cfb0: 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74  ame)==sizeof(pIt
cfc0: 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20  em->pExpr) );.  
cfd0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66  assert( offsetof
cfe0: 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74  (struct ExprList
cff0: 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20  _item,pExpr)==0 
d000: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74  );.  memset(&pIt
d010: 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65  em->zName,0,size
d020: 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65  of(*pItem)-offse
d030: 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c  tof(struct ExprL
d040: 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29  ist_item,zName))
d050: 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  ;.  pItem->pExpr
d060: 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75   = pExpr;.  retu
d070: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
d080: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
d090: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
d0a0: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
d0b0: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
d0c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d0d0: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
d0e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d0f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
d100: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d110: 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64  .** pColumns and
d120: 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65   pExpr form a ve
d130: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20  ctor assignment 
d140: 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66  which is part of
d150: 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75   the SET.** clau
d160: 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  se of an UPDATE 
d170: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65  statement.  Like
d180: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
d190: 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65      (a,b,c) = (e
d1a0: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
d1b0: 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62  ).** Or:    (a,b
d1c0: 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c  ,c) = (SELECT x,
d1d0: 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a  y,z FROM ....).*
d1e0: 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65  *.** For each te
d1f0: 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  rm of the vector
d200: 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70   assignment, app
d210: 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20  end new entries 
d220: 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  to the.** expres
d230: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
d240: 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66    In the case of
d250: 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74   a subquery on t
d260: 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a  he RHS, append.*
d270: 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  * TK_SELECT_COLU
d280: 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  MN expressions..
d290: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
d2a0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d2b0: 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73  ndVector(.  Pars
d2c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d2d0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d2e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d2f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d300: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
d310: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
d320: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
d330: 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e   IdList *pColumn
d340: 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  s,      /* List 
d350: 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20  of names of LHS 
d360: 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e  of the assignmen
d370: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
d380: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
d390: 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   Vector expressi
d3a0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
d3b0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
d3c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d3d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d3e0: 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  b;.  int n;.  in
d3f0: 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  t i;.  int iFirs
d400: 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  t = pList ? pLis
d410: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
d420: 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20  /* pColumns can 
d430: 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65  only be NULL due
d440: 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61   to an OOM but a
d450: 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  n OOM will cause
d460: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72   an.  ** exit pr
d470: 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
d480: 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65  ine being invoke
d490: 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  d */.  if( NEVER
d4a0: 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20  (pColumns==0) ) 
d4b0: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
d4c0: 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  nd_error;.  if( 
d4d0: 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20  pExpr==0 ) goto 
d4e0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d4f0: 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ror;..  /* If th
d500: 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f  e RHS is a vecto
d510: 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69  r, then we can i
d520: 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b  mmediately check
d530: 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20   to see that .  
d540: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
d550: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d  he RHS and LHS m
d560: 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68  atch.  But if th
d570: 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43  e RHS is a SELEC
d580: 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72  T, .  ** wildcar
d590: 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20  ds ("*") in the 
d5a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
d5b0: 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  e SELECT must be
d5c0: 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
d5d0: 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20  .  ** we can do 
d5e0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20  the size check, 
d5f0: 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a  so defer the siz
d600: 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f  e check until co
d610: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20  de generation.. 
d620: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
d630: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op!=TK_SELECT &
d640: 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21  & pColumns->nId!
d650: 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56  =(n=sqlite3ExprV
d660: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
d670: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
d680: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d690: 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
d6a0: 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
d6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d6c0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
d6d0: 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74  nId, n);.    got
d6e0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
d6f0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f  error;.  }..  fo
d700: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e  r(i=0; i<pColumn
d710: 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  s->nId; i++){.  
d720: 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72    Expr *pSubExpr
d730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f   = sqlite3ExprFo
d740: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61  rVectorField(pPa
d750: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a  rse, pExpr, i);.
d760: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
d770: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d780: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
d790: 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20   pSubExpr);.    
d7a0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d7b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d7c0: 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b  ->nExpr==iFirst+
d7d0: 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69  i+1 );.      pLi
d7e0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d7f0: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43  pr-1].zName = pC
d800: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
d810: 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  me;.      pColum
d820: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ns->a[i].zName =
d830: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
d840: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
d850: 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d  Failed && pExpr-
d860: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
d870: 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d  & ALWAYS(pList!=
d880: 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  0) ){.    Expr *
d890: 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e  pFirst = pList->
d8a0: 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b  a[iFirst].pExpr;
d8b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d8c0: 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  rst!=0 );.    as
d8d0: 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70  sert( pFirst->op
d8e0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
d8f0: 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  MN );.     .    
d900: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c  /* Store the SEL
d910: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
d920: 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69   pRight so it wi
d930: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d940: 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  en.    ** sqlite
d950: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
d960: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
d970: 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68     pFirst->pRigh
d980: 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  t = pExpr;.    p
d990: 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Expr = 0;..    /
d9a0: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73  * Remember the s
d9b0: 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  ize of the LHS i
d9c0: 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74  n iTable so that
d9d0: 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68   we can check th
d9e0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48  at.    ** the RH
d9f0: 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20  S and LHS sizes 
da00: 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64  match during cod
da10: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f  e generation. */
da20: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61  .    pFirst->iTa
da30: 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ble = pColumns->
da40: 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72  nId;.  }..vector
da50: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20  _append_error:. 
da60: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
da70: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
da80: 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e  ite3RenameExprUn
da90: 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  map(pParse, pExp
daa0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
dab0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
dac0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
dad0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
dae0: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
daf0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
db00: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
db10: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
db20: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
db30: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
db40: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
db50: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
db60: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
db70: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
db80: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
db90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
dba0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
dbb0: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
dbc0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
dbd0: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
dbe0: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
dbf0: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
dc00: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
dc10: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
dc20: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
dc30: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
dc40: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
dc50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
dc60: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
dc70: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
dc80: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
dc90: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
dca0: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
dcb0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
dcc0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
dcd0: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
dce0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
dcf0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
dd00: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
dd10: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
dd20: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
dd30: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
dd40: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
dd50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
dd60: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
dd70: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dd80: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
dd90: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
dda0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
ddb0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
ddc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ddd0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
dde0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ddf0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
de00: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
de10: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
de20: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
de30: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
de40: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
de50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
de60: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
de70: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
de80: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
de90: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
dea0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
deb0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
dec0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
ded0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
dee0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
def0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
df00: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
df10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
df20: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
df30: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
df40: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
df50: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
df60: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
df70: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
df80: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
df90: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
dfa0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
dfb0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
dfc0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
dfd0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
dfe0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
dff0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  BJECT ){.      s
e000: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
e010: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
e020: 69 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  id*)pItem->zName
e030: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , pName);.    }.
e040: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
e050: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
e060: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
e070: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
e080: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
e090: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
e0a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
e0b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
e0c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
e0d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
e0e0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
e0f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
e100: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
e110: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
e120: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
e130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
e140: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
e150: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e160: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
e170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e180: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e190: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
e1a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
e1b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
e1c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
e1d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f  he span. */.  co
e1e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
e1f0: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ,     /* Start o
e200: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20  f the span */.  
e210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
e220: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
e230: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b  f the span */.){
e240: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e250: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
e260: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e270: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
e280: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
e290: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
e2a0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e2b0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
e2c0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
e2d0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
e2e0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
e2f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
e300: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
e310: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
e320: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
e330: 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c  te3DbSpanDup(db,
e340: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
e350: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
e360: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e370: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
e380: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
e390: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
e3a0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
e3b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
e3c0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
e3d0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
e3e0: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
e3f0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
e400: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
e410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
e420: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
e430: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
e440: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e450: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
e460: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e470: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e480: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
e490: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e4a0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
e4b0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
e4c0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
e4d0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
e4e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e4f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
e500: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
e510: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
e520: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
e530: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
e540: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
e550: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
e560: 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65  oid exprListDele
e570: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
e580: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e590: 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c  t){.  int i = pL
e5a0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74  ist->nExpr;.  st
e5b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e5c0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69  em *pItem =  pLi
e5d0: 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28  st->a;.  assert(
e5e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e5f0: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  );.  do{.    sql
e600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
e610: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
e620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e630: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e640: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
e650: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e660: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
e670: 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c  pItem++;.  }whil
e680: 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71  e( --i>0 );.  sq
e690: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
e6a0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
e6b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e6c0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
e6d0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
e6e0: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
e6f0: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
e700: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
e710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e720: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
e730: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
e740: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
e750: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
e760: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
e770: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
e780: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
e790: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e7a0: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61    u32 m = 0;.  a
e7b0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e7c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
e7d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e7e0: 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70  +){.     Expr *p
e7f0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
e800: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61  i].pExpr;.     a
e810: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e820: 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  );.     m |= pEx
e830: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  pr->flags;.  }. 
e840: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
e850: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45  .** This is a SE
e860: 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61  LECT-node callba
e870: 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ck for the expre
e880: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61  ssion walker tha
e890: 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69  t.** always "fai
e8a0: 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20  ls".  By "fail" 
e8b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65  in this case, we
e8c0: 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61   mean set.** pWa
e8d0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a  lker->eCode to z
e8e0: 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  ero and abort..*
e8f0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
e900: 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75  ck is used by mu
e910: 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f  ltiple expressio
e920: 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e  n walkers..*/.in
e930: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
e940: 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a  alkFail(Walker *
e950: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
e960: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
e970: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
e980: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
e990: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e9a0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
e9c0: 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
e9d0: 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68  on is an ID with
e9e0: 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22   the name "true"
e9f0: 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74   or "false".** t
ea00: 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69  hen convert it i
ea10: 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41  nto an TK_TRUEFA
ea20: 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72  LSE term.  Retur
ea30: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
ea40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
ea50: 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65  happened, and ze
ea60: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
ea70: 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65  sion is unaltere
ea80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ea90: 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c  3ExprIdToTrueFal
eaa0: 73 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  se(Expr *pExpr){
eab0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
eac0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
ead0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Expr->op==TK_STR
eae0: 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 21 45 78  ING );.  if( !Ex
eaf0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
eb00: 78 70 72 2c 20 45 50 5f 51 75 6f 74 65 64 29 0a  xpr, EP_Quoted).
eb10: 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 74     && (sqlite3St
eb20: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
eb30: 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d  Token, "true")==
eb40: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
eb50: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
eb60: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c  ->u.zToken, "fal
eb70: 73 65 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  se")==0).  ){.  
eb80: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
eb90: 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20  _TRUEFALSE;.    
eba0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
ebb0: 70 45 78 70 72 2c 20 70 45 78 70 72 2d 3e 75 2e  pExpr, pExpr->u.
ebc0: 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45  zToken[4]==0 ? E
ebd0: 50 5f 49 73 54 72 75 65 20 3a 20 45 50 5f 49 73  P_IsTrue : EP_Is
ebe0: 46 61 6c 73 65 29 3b 0a 20 20 20 20 72 65 74 75  False);.    retu
ebf0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
ec00: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
ec10: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
ec20: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
ec30: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
ec40: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
ec50: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
ec60: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
ec70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ec80: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
ec90: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
eca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ecb0: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
ecc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
ecd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
ece0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
ecf0: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
ed00: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
ed10: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
ed20: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
ed30: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
ed40: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
ed50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
ed60: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
ed70: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
ed80: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
ed90: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
eda0: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
edb0: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
edc0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
edd0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
ede0: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
edf0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
ee00: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
ee10: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
ee20: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
ee30: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
ee40: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
ee50: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
ee60: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
ee70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
ee80: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
ee90: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
eea0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
eeb0: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
eec0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
eed0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
eee0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
eef0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
ef00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
ef10: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
ef20: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
ef30: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
ef40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
ef50: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
ef60: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
ef70: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
ef80: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
ef90: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
efa0: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
efb0: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
efc0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
efd0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
efe0: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
eff0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
f000: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f010: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
f020: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
f030: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
f040: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
f050: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
f060: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
f070: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
f080: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
f090: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
f0a0: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
f0b0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
f0c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
f0d0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
f0e0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
f0f0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
f100: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
f110: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
f120: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
f130: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
f140: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
f150: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f160: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
f170: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
f180: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
f190: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
f1a0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
f1b0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
f1c0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
f1d0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
f1e0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
f1f0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
f200: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
f210: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
f220: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
f230: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
f240: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
f250: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
f260: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
f270: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
f280: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f290: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
f2a0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
f2b0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
f2c0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
f2d0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
f2e0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
f2f0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
f300: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
f310: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
f320: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
f330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f340: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
f350: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
f360: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
f370: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f380: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
f390: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
f3a0: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
f3b0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
f3c0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
f3d0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
f3e0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
f3f0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
f400: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f410: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
f420: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
f430: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
f440: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
f450: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
f460: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
f470: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
f480: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
f490: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
f4a0: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
f4b0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f4c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
f4e0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f4f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f500: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
f510: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
f520: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
f530: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
f540: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
f550: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
f560: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
f570: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
f580: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
f590: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f5a0: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
f5b0: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
f5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f5d0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
f5e0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
f5f0: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
f600: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
f610: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
f620: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
f630: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
f640: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f650: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
f660: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
f680: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
f690: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f6a0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
f6b0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
f6c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f6d0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
f6e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
f6f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f700: 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
f710: 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  && pWalker->eCod
f720: 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=2 ){.        
f730: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f740: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f750: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f760: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
f770: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
f780: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
f790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f7a0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f7b0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f7c0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
f7d0: 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
f7e0: 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ROW:.    case TK
f7f0: 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20 20  _REGISTER:.     
f800: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f810: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
f820: 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
f830: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f840: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
f850: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
f860: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
f870: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f880: 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
f890: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
f8a0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f8b0: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
f8c0: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
f8d0: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
f8e0: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
f8f0: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
f900: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
f910: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
f920: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
f930: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
f940: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
f950: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
f960: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f970: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f980: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
f990: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
f9a0: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
f9b0: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
f9c0: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
f9d0: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
f9e0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
f9f0: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
fa00: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
fa10: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
fa20: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
fa30: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
fa40: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fa50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
fa60: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
fa70: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
fa80: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
fa90: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
faa0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fab0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
fac0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
fad0: 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
fae0: 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ows */.      tes
faf0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fb00: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
fb10: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
fb20: 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
fb30: 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ows */.      ret
fb40: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
fb50: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
fb60: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
fb70: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
fb80: 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
fb90: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
fba0: 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
fbb0: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
fbc0: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
fbd0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
fbe0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
fbf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
fc00: 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
fc10: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
fc20: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
fc30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fc40: 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
fc50: 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
fc60: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
fc70: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
fc80: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
fc90: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
fca0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
fcb0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
fcc0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
fcd0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
fce0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
fcf0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
fd00: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
fd10: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
fd20: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
fd30: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
fd40: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
fd50: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
fd60: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
fd70: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
fd80: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
fd90: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
fda0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
fdb0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
fdc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
fdd0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
fde0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
fdf0: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
fe00: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
fe10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
fe20: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
fe30: 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ro if.**.**   (1
fe40: 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
fe50: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e   is constant, an
fe60: 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20 65  d.**   (2) the e
fe70: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f  xpression does o
fe80: 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
fe90: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
fea0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
feb0: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a   LEFT JOIN, and.
fec0: 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78 70  **   (3) the exp
fed0: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
fee0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f   contain any EP_
fef0: 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55  FixedCol TK_COLU
ff00: 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65 72  MN.**       oper
ff10: 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79 20  ands created by 
ff20: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  the constant pro
ff30: 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
ff40: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ation..**.** Whe
ff50: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
ff60: 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74 20  eturns true, it 
ff70: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
ff80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
ff90: 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
ffa0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43 6f   the pParse->pCo
ffb0: 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e 64  nstExpr list and
ffc0: 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
ffd0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70  when.** the prep
ffe0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 73  ared statement s
fff0: 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20 73  tarts up.  See s
10000 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
10010 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Init()..*/.int s
10020 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10030 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
10040 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
10050 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
10060 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
10070 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10080 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10090 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
100a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
100b0 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
100c0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
100d0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
100e0 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
100f0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
10100 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
10110 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
10120 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
10130 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
10140 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
10150 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
10160 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10170 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
10180 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
10190 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
101a0 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
101b0 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iCur);.}.../*.
101c0 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
101d0 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
101e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
101f0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
10200 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  upBy()..*/.stati
10210 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
10220 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10230 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
10240 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
10250 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
10260 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d  oupBy = pWalker-
10270 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  >u.pGroupBy;.  i
10280 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  nt i;..  /* Chec
10290 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69 64  k if pExpr is id
102a0 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47  entical to any G
102b0 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66  ROUP BY term. If
102c0 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20   so, consider.  
102d0 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20  ** it constant. 
102e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
102f0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
10300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10310 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   *p = pGroupBy->
10320 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10330 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
10340 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c  ompare(0, pExpr,
10350 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20   p, -1)<2 ){.   
10360 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10370 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
10380 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72  NCollSeq(pWalker
10390 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  ->pParse, p);.  
103a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
103b0 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29  sBinary(pColl) )
103c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
103d0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
103e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
103f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10400 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
10410 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  ct. If so, consi
10420 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e  der it variable.
10430 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
10440 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
10450 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10460 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
10470 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
10480 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
10490 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78    }..  return ex
104a0 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
104b0 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29  (pWalker, pExpr)
104c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
104d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
104e0 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ree passed as th
104f0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10500 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
10510 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  o.** if the expr
10520 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20  ession consists 
10530 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
10540 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20  tants or copies 
10550 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20  of terms .** in 
10560 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f  pGroupBy that so
10570 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41  rt with the BINA
10580 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  RY collation seq
10590 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uence..**.** Thi
105a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
105b0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
105c0 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  f a term of the 
105d0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61  HAVING clause ca
105e0 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64  n.** be promoted
105f0 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20   into the WHERE 
10600 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
10610 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f  r for such a pro
10620 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a  motion to work,.
10630 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10640 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
10650 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
10660 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
10670 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20  members of.** a 
10680 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65  "group".  The re
10690 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
106a0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
106b0 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a   must be BINARY.
106c0 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ** assumes that 
106d0 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  no other collati
106e0 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  ng sequence will
106f0 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72   have a finer-gr
10700 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e  ained.** groupin
10710 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20  g than binary.  
10720 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28  In other words (
10730 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  A=B COLLATE bina
10740 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41  ry) implies.** A
10750 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65  =B in every othe
10760 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
10770 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69  ence.  The requi
10780 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a  rement that the.
10790 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42  ** GROUP BY be B
107a0 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65  INARY is stricte
107b0 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
107c0 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f  .  It would also
107d0 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d   work.** to prom
107e0 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ote HAVING claus
107f0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
10800 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65  same alternative
10810 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
10820 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52  quence as the GR
10830 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74  OUP BY term, but
10840 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61   that is much ha
10850 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a  rder to check,.*
10860 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * alternative co
10870 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10880 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  s are uncommon, 
10890 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  and this is only
108a0 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   an.** optimizat
108b0 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20  ion, so we take 
108c0 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74  the easy way out
108d0 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75   and simply requ
108e0 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  ire the.** GROUP
108f0 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42   BY to use the B
10900 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20  INARY collating 
10910 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74  sequence..*/.int
10920 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10930 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
10940 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10950 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  xpr *p, ExprList
10960 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57   *pGroupBy){.  W
10970 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
10980 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
10990 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
109a0 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
109b0 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65  GroupBy;.  w.xSe
109c0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
109d0 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79  ;.  w.u.pGroupBy
109e0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77   = pGroupBy;.  w
109f0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
10a00 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
10a10 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
10a20 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
10a30 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10a40 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10a50 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
10a60 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10a70 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
10a80 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
10a90 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
10aa0 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
10ab0 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
10ac0 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
10ad0 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
10ae0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
10af0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
10b00 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
10b10 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10b20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
10b30 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
10b40 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
10b50 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10b60 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
10b70 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
10b80 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10b90 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
10ba0 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69  on(Expr *p, u8 i
10bb0 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74  sInit){.  assert
10bc0 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69  ( isInit==0 || i
10bd0 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65  sInit==1 );.  re
10be0 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
10bf0 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29  (p, 4+isInit, 0)
10c00 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
10c10 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
10c20 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c  _HINTS./*.** Wal
10c30 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
10c40 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
10c50 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
10c60 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  n contains a.** 
10c70 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65  subquery of some
10c80 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30   kind.  Return 0
10c90 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
10ca0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
10cb0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
10cc0 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28  ontainsSubquery(
10cd0 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
10ce0 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10cf0 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
10d00 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
10d10 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
10d20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10d30 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
10d40 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
10d50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10d60 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
10d70 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
10d80 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
10d90 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10da0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
10db0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
10dc0 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e==0;.}.#endif..
10dd0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
10de0 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
10df0 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
10e00 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
10e10 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
10e20 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
10e30 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
10e40 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
10e50 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
10e60 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
10e70 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
10e80 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
10e90 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
10ea0 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
10eb0 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
10ec0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
10ed0 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
10ee0 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
10ef0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
10f00 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10f10 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
10f20 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
10f30 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
10f40 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
10f50 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
10f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f   following on OO
10f70 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  M */..  /* If an
10f80 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
10f90 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61  n integer litera
10fa0 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61  l that fits in a
10fb0 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20   signed 32-bit. 
10fc0 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65   ** integer, the
10fd0 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75  n the EP_IntValu
10fe0 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65  e flag will have
10ff0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
11000 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
11010 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op!=TK_INTEGER
11020 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20   || (p->flags & 
11030 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a  EP_IntValue)!=0.
11040 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
11050 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d  lite3GetInt32(p-
11060 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d  >u.zToken, &rc)=
11070 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  =0 );..  if( p->
11080 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
11090 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c  lue ){.    *pVal
110a0 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ue = p->u.iValue
110b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
110c0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d    }.  switch( p-
110d0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
110e0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
110f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78    rc = sqlite3Ex
11100 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
11110 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
11120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11130 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
11140 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
11150 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
11160 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11170 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
11180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
11190 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38  ert( v!=(-214748
111a0 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20  3647-1) );.     
111b0 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
111c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
111d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
111e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
111f0 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
11200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11220 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
11230 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
11240 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
11250 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
11260 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
11270 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
11280 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
11290 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
112a0 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
112b0 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
112c0 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
112d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
112e0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
112f0 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
11300 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
11310 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
11320 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
11330 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
11340 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
11350 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
11360 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
11370 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11380 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
11390 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
113a0 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
113b0 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
113c0 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
113d0 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
113e0 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
113f0 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
11400 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
11410 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
11420 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
11430 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
11440 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
11450 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
11460 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
11470 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
11480 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
11490 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
114a0 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
114b0 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
114c0 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
114d0 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 0a  p==TK_UMINUS ){.
114e0 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
114f0 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ;.  }.  op = p->
11500 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
11510 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
11520 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
11530 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11540 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
11550 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
11560 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
11570 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
11580 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
11590 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
115a0 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
115b0 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
115c0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
115d0 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
115e0 20 20 20 20 20 20 20 20 20 70 2d 3e 79 2e 70 54           p->y.pT
115f0 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66  ab==0 ||  /* Ref
11600 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e  erence to column
11610 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70   of index on exp
11620 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
11630 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
11640 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 79 2e 70  umn>=0 && p->y.p
11650 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
11660 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
11670 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  );.    default:.
11680 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11690 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
116a0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
116b0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
116c0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
116d0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
116e0 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
116f0 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
11700 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
11710 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
11720 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
11730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11740 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
11750 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
11760 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
11770 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
11780 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
11790 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
117a0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
117b0 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
117c0 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
117d0 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
117e0 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
117f0 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
11800 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11810 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
11820 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
11830 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
11840 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
11850 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
11860 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72  AFF_BLOB ) retur
11870 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
11880 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
11890 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
118a0 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
118b0 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
118c0 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
118d0 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
118e0 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
118f0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
11900 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
11910 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11920 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
11930 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
11940 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11950 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11960 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
11970 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
11980 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
11990 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
119a0 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
119b0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
119c0 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
119d0 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
119e0 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
119f0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
11a00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
11a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11a20 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
11a30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
11a40 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
11a50 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
11a60 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
11a70 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
11a80 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
11a90 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
11aa0 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
11ab0 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
11ac0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11ad0 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
11ae0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11b00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
11b10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
11b20 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
11b30 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
11b40 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
11b50 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
11b60 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
11b70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11b80 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
11b90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11ba0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11bb0 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
11bc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11bd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11be0 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
11bf0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
11c00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11c10 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53  ** pX is the RHS
11c20 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
11c30 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20  or.  If pX is a 
11c40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11c50 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65   .** that can be
11c60 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61   simplified to a
11c70 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63   direct table ac
11c80 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72  cess, then retur
11c90 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
11ca0 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
11cb0 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69  tement.  If pX i
11cc0 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73  s not a SELECT s
11cd0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20  tatement,.** or 
11ce0 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  if the SELECT st
11cf0 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f  atement needs to
11d00 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69   be manifested i
11d10 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a  nto a transient.
11d20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ** table, then r
11d30 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23  eturn NULL..*/.#
11d40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11d50 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
11d60 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e  ic Select *isCan
11d70 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45  didateForInOpt(E
11d80 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65  xpr *pX){.  Sele
11d90 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
11da0 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
11db0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
11dc0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
11dd0 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
11de0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11df0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
11e00 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
11e10 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
11e20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
11e30 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
11e40 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
11e50 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
11e60 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
11e70 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
11e80 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
11e90 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
11eb0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
11ec0 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
11ed0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
11ee0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
11ef0 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
11f00 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
11f10 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11f20 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
11f30 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
11f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
11f50 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
11f60 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
11f70 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
11f80 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
11f90 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
11fa0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
11fb0 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
11fc0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
11fd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
11fe0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
11ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
12000 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
12010 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
12020 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
12030 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12040 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
12050 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
12060 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
12070 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12080 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
12090 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
120a0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
120b0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
120c0 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
120d0 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
120e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
120f0 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
12100 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
12110 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
12120 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
12130 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
12140 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
12150 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
12160 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
12170 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
12180 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
12190 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
121a0 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
121b0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
121c0 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
121d0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
121e0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
121f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
12200 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
12210 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
12220 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
12230 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
12240 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
12250 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
12260 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
12270 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
12280 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
12290 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
122a0 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
122b0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
122c0 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
122d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
122e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
122f0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
12300 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
12310 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
12320 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
12330 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
12340 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
12350 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12360 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
12370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12380 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
12390 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
123a0 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
123b0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
123c0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
123d0 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
123e0 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
123f0 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
12400 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
12410 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
12420 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
12430 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
12440 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
12450 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
12460 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
12470 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
12480 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
12490 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
124a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
124b0 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
124c0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
124d0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
124e0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
124f0 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
12500 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
12510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12520 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12530 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
12540 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12550 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12560 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
12570 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
12580 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
12590 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
125a0 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
125b0 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
125c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
125d0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
125e0 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
125f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
12600 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
12610 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
12620 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12630 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
12640 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
12650 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12660 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
12670 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
12680 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
12690 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
126a0 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
126b0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
126c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
126d0 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
126e0 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
126f0 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
12700 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
12710 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
12720 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
12730 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
12740 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
12750 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12760 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
12770 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
12780 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
12790 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
127a0 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
127b0 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
127c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
127d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
127e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
127f0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
12800 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
12810 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
12820 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
12830 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12840 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
12850 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12860 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
12870 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
12880 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
12890 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
128a0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
128b0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
128c0 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
128d0 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
128e0 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
128f0 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
12900 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
12910 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
12920 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
12930 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
12940 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
12950 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
12960 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
12970 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
12980 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
12990 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
129a0 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
129b0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
129c0 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
129d0 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
129e0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
129f0 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
12a00 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
12a10 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
12a20 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
12a30 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
12a40 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
12a50 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
12a60 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
12a70 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
12a80 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
12a90 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
12aa0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
12ab0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12ac0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
12ad0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
12ae0 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12af0 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
12b00 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12b10 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
12b20 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
12b30 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
12b40 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12b50 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
12b60 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
12b70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12b90 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
12ba0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
12bb0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
12bc0 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
12bd0 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
12be0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
12bf0 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
12c20 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
12c30 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
12c40 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
12c50 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
12c60 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
12c70 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
12c80 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
12c90 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
12ca0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
12cb0 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
12cc0 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
12cd0 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
12ce0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12cf0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
12d00 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
12d10 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
12d20 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
12d30 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
12d40 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
12d50 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
12d60 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
12d70 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
12d80 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
12d90 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
12da0 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
12db0 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
12dc0 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
12dd0 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
12de0 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
12df0 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
12e00 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
12e10 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
12e20 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
12e30 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
12e40 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
12e50 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
12e60 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
12e70 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
12e80 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
12e90 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
12ea0 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
12eb0 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
12ec0 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
12ed0 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
12ee0 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
12ef0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
12f00 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
12f10 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12f20 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
12f30 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
12f40 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
12f50 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12f60 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
12f70 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
12f80 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
12f90 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
12fa0 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
12fb0 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
12fc0 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
12fd0 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
12fe0 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
12ff0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
13000 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
13010 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
13020 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
13030 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
13040 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
13050 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
13060 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
13070 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
13080 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
13090 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
130a0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
130b0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
130c0 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
130d0 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
130e0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
130f0 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
13100 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
13110 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
13120 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
13130 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
13140 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
13150 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
13160 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
13170 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
13180 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
13190 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
131a0 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
131b0 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
131c0 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
131d0 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
131e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
131f0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
13200 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
13210 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
13220 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
13230 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
13240 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
13250 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
13260 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
13270 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
13280 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
13290 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
132a0 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
132b0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
132c0 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
132d0 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
132e0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
132f0 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
13300 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
13310 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
13320 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
13330 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
13340 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
13350 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
13360 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
13370 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
13380 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
13390 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
133a0 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
133b0 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
133c0 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
133d0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
133e0 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
133f0 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
13400 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
13410 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
13420 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
13430 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
13440 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
13450 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
13460 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
13470 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
13480 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
13490 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
134a0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
134b0 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
134c0 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
134d0 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
134e0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
134f0 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
13500 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
13510 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
13520 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
13530 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
13540 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
13550 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
13560 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
13570 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
13580 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
13590 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
135a0 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
135b0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
135c0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
135d0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
135e0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
135f0 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
13600 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
13610 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
13620 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
13630 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
13640 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
13650 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
13660 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
13670 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
13680 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
13690 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
136a0 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
136b0 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
136c0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
136d0 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
136e0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
136f0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
13700 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
13710 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
13720 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
13730 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
13740 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
13750 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
13760 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
13770 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
13780 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
13790 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
137a0 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
137b0 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
137c0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
137d0 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
137e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
137f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
13800 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
13810 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13820 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13830 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13840 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
13850 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
13860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
13870 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
13880 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
13890 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
138a0 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
138b0 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
138c0 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
138d0 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
138e0 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
138f0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
13900 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13910 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
13920 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
13930 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
13940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13950 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
13960 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
13970 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 20   RHS fields */. 
13980 20 69 6e 74 20 2a 70 69 54 61 62 20 20 20 20 20   int *piTab     
13990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
139a0 55 54 3a 20 69 6e 64 65 78 20 74 6f 20 75 73 65  UT: index to use
139b0 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
139c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
139e0 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
139f0 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
13a00 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
13a10 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
13a40 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
13a50 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
13a60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13a80 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
13a90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13aa0 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
13ad0 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
13ae0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
13af0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13b00 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
13b10 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
13b20 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
13b30 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
13b40 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
13b50 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
13b60 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
13b70 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66  OP)!=0;..  /* If
13b80 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73   the RHS of this
13b90 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
13ba0 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61  r is a SELECT, a
13bb0 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73  nd if it matters
13bc0 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
13bd0 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54  r not the SELECT
13be0 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
13bf0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68   NULL values, ch
13c00 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a  eck whether.  **
13c10 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20   or not NULL is 
13c20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
13c30 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  e (it may not be
13c40 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  , for example, d
13c50 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20  ue .  ** to NOT 
13c60 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
13c70 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e   in the schema).
13c80 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75   If no NULL valu
13c90 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
13ca0 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48  .  ** set prRhsH
13cb0 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f  asNull to 0 befo
13cc0 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
13cd0 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61  */.  if( prRhsHa
13ce0 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c  sNull && (pX->fl
13cf0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
13d00 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ct) ){.    int i
13d10 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
13d20 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70  pEList = pX->x.p
13d30 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
13d40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13d50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
13d60 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
13d70 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
13d80 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ll(pEList->a[i].
13d90 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a  pExpr) ) break;.
13da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13db0 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
13dc0 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73  {.      prRhsHas
13dd0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Null = 0;.    }.
13de0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
13df0 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
13e00 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
13e10 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
13e20 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
13e30 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
13e40 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
13e50 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
13e60 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
13e70 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
13e80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13e90 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43  r==0 && (p = isC
13ea0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
13eb0 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  (pX))!=0 ){.    
13ec0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13ed0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
13ee0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13ef0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13f00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13f30 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
13f40 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13f70 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
13f80 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72  pTab */.    Expr
13f90 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13fa0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e  ->pEList;.    in
13fb0 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74  t nExpr = pEList
13fc0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ->nExpr;..    as
13fd0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
13fe0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
13ff0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
14000 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14010 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
14020 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
14030 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
14040 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
14050 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14060 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
14070 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
14080 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
14090 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
140a0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
140b0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
140c0 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
140d0 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  0].pTab;..    /*
140e0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
140f0 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
14100 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
14110 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
14120 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
14130 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
14140 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
14150 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
14160 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
14170 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
14180 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
14190 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
141a0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
141b0 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  me);..    assert
141c0 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  (v);  /* sqlite3
141d0 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c  GetVdbe() has al
141e0 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f  ways been previo
141f0 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  usly called */. 
14200 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
14210 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
14220 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
14230 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
14240 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72   "x IN (SELECT r
14250 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29  owid FROM table)
14260 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  " case */.      
14270 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
14280 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14290 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20   OP_Once);.     
142a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
142b0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
142c0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
142d0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
142e0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
142f0 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
14300 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
14310 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
14320 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
14330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55  ,.            "U
14340 53 49 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43  SING ROWID SEARC
14350 48 20 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f  H ON TABLE %s FO
14360 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
14370 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
14380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
14390 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
143a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
143b0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
143e0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
143f0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
14400 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
14410 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
14420 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
14430 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
14440 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
14450 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
14460 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
14470 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
14480 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
14490 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
144a0 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
144b0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
144c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
144d0 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
144e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
144f0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
14500 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
14510 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
14520 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
14530 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
14540 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
14550 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
14560 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
14570 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
14580 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
14590 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
145a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
145b0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
145c0 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
145d0 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
145e0 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
145f0 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
14600 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
14610 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
14620 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14630 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
14640 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14650 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14660 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
14670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14680 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14690 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
146a0 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
146b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
146c0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
146d0 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
146e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
146f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14700 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
14710 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
14720 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
14730 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
14740 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
14750 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
14760 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
14770 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
14780 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
14790 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
147a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
147b0 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
147c0 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
147d0 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
147e0 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
147f0 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
14800 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
14810 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
14820 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
14830 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
14840 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
14850 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
14860 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
14870 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14880 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
14890 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
148a0 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
148b0 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
148c0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
148d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
148e0 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
148f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
14900 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
14910 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
14920 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
14930 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
14940 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
14950 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
14960 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
14970 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
14980 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
14990 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
149a0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
149b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
149c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
149d0 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
149e0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
149f0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
14a00 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
14a10 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14a20 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
14a30 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
14a40 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
14a50 64 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e  dxWhere!=0 ) con
14a60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
14a70 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c   /* Maximum nCol
14a80 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f  umn is BMS-2, no
14a90 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74  t BMS-1, so that
14aa0 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a   we can compute.
14ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54            ** BIT
14ac0 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68  MASK(nExpr) with
14ad0 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20  out overflowing 
14ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
14af0 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
14b00 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  lumn==BMS-2 );. 
14b10 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14b20 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
14b30 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
14b40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14b50 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20  Column>=BMS-1 ) 
14b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14b70 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e      if( mustBeUn
14b80 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ique ){.        
14b90 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
14ba0 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20  eyCol>nExpr.    
14bb0 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78           ||(pIdx
14bc0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20  ->nColumn>nExpr 
14bd0 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  && !IsUniqueInde
14be0 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20  x(pIdx)).       
14bf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14c00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
14c10 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
14c20 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65  s not unique ove
14c30 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c  r the IN RHS col
14c40 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
14c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14c60 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63  }.  .          c
14c70 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a  olUsed = 0;   /*
14c80 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65   Columns of inde
14c90 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  x used so far */
14ca0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
14cb0 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
14cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
14cd0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14ce0 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14cf0 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14d00 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
14d10 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
14d20 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ;.            Co
14d40 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
14d50 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
14d60 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
14d70 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20  , pLhs, pRhs);. 
14d80 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
14d90 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14da0 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30   assert( pReq!=0
14db0 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d   || pRhs->iColum
14dc0 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70  n==XN_ROWID || p
14dd0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20  Parse->nErr );. 
14de0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
14df0 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b  =0; j<nExpr; j++
14e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14e10 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
14e20 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43  umn[j]!=pRhs->iC
14e30 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
14e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14e50 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
14e60 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
14e70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
14e80 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  q!=0 && sqlite3S
14e90 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61  trICmp(pReq->zNa
14ea0 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
14eb0 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [j])!=0 ){.     
14ec0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
14ed0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
14ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14ef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14f10 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
14f20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14f30 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53        mCol = MAS
14f40 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20  KBIT(j);.       
14f50 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20       if( mCol & 
14f60 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b  colUsed ) break;
14f70 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20   /* Each column 
14f80 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  used only once *
14f90 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  /.            co
14fa0 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20  lUsed |= mCol;. 
14fb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14fc0 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20  iMap ) aiMap[i] 
14fd0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = j;.          }
14fe0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73  .  .          as
14ff0 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c  sert( i==nExpr |
15000 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b  | colUsed!=(MASK
15010 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b  BIT(nExpr)-1) );
15020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
15030 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54  olUsed==(MASKBIT
15040 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20  (nExpr)-1) ){.  
15050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15060 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
15070 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
15080 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69  the index pIdx i
15090 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20  s usable */.    
150a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
150b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
150c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
150d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
150e0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
150f0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15100 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  ((pParse, 0,.   
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
15130 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49  G INDEX %s FOR I
15140 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78  N-OPERATOR",pIdx
15150 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
15160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15170 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
15180 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
15190 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
151a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
151b0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
151c0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
151d0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
151e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
151f0 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
15200 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
15210 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
15220 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
15230 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
15240 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
15250 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15260 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
15270 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
15280 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
15290 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
152a0 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
152b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
152c0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
152e0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
152f0 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
15300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15310 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
15320 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
15350 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
15360 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
15370 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
15380 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
15390 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
153a0 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
153b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
153c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
153d0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
153e0 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
153f0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
15400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
15420 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15430 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
15440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15450 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
15460 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
15470 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
15480 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
15490 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
154a0 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
154b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
154c0 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
154d0 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
154e0 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
154f0 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
15500 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
15510 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
15520 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
15530 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
15540 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
15550 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
15560 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
15570 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
15580 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
15590 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
155a0 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
155b0 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
155c0 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
155d0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
155e0 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
155f0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
15600 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
15610 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
15620 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
15630 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
15640 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
15650 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
15660 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
15670 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
15680 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
15690 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
156a0 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
156b0 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
156c0 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
156d0 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
156e0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
156f0 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
15700 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
15710 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
15720 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
15730 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
15740 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
15750 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
15760 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
15770 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
15780 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
15790 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
157a0 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
157b0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
157c0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
157d0 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
157e0 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
157f0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15800 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
15810 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15820 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
15830 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
15840 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  op = 0;.    }els
15850 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
15860 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
15870 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
15880 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
15890 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
158a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
158b0 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
158c0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73    sqlite3CodeRhs
158d0 4f 66 49 4e 28 70 50 61 72 73 65 2c 20 70 58 2c  OfIN(pParse, pX,
158e0 20 69 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20   iTab);.    if( 
158f0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a  rMayHaveNull ){.
15900 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
15910 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
15920 54 61 62 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  Tab, rMayHaveNul
15930 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
15940 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
15950 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
15960 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  op;.  }..  if( a
15970 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49  iMap && eType!=I
15980 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
15990 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  C && eType!=IN_I
159a0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
159b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
159c0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
159d0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
159e0 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66  X->pLeft);.    f
159f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
15a00 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a  ) aiMap[i] = i;.
15a10 20 20 7d 0a 20 20 2a 70 69 54 61 62 20 3d 20 69    }.  *piTab = i
15a20 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 65 54  Tab;.  return eT
15a30 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
15a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15a50 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
15a60 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
15a70 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
15a80 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
15a90 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
15aa0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
15ab0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
15ac0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
15ad0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
15ae0 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
15af0 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
15b00 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
15b10 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
15b20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
15b30 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
15b40 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
15b50 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
15b60 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
15b70 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
15b80 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
15b90 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
15ba0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
15bb0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
15bc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15bd0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
15be0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
15bf0 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
15c00 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
15c10 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
15c20 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
15c30 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
15c40 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
15c50 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
15c60 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
15c70 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
15c80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
15c90 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
15ca0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
15cb0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
15cc0 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66  b, nVal+1);.  if
15cd0 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( zRet ){.    in
15ce0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
15cf0 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
15d00 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d        Expr *pA =
15d10 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
15d20 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
15d30 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , i);.      char
15d40 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   a = sqlite3Expr
15d50 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20  Affinity(pA);.  
15d60 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
15d70 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b  ){.        zRet[
15d80 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  i] = sqlite3Comp
15d90 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c  areAffinity(pSel
15da0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
15db0 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20  ].pExpr, a);.   
15dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15dd0 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20    zRet[i] = a;. 
15de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15df0 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c   zRet[nVal] = '\
15e00 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0';.  }.  return
15e10 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
15e20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
15e40 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72  .** Load the Par
15e50 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
15e60 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
15e70 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65  gument with an e
15e80 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
15e90 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
15ea0 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
15eb0 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
15ec0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d  mns - expected M
15ed0 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
15ee0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
15ef0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
15f00 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69  , int nActual, i
15f10 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63  nt nExpect){.  c
15f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
15f30 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65  = "sub-select re
15f40 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73  turns %d columns
15f50 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b   - expected %d";
15f60 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
15f70 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c  sg(pParse, zFmt,
15f80 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63   nActual, nExpec
15f90 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
15fa0 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
15fb0 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
15fc0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75   that has been u
15fd0 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74  sed in a context
15fe0 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20   where.** it is 
15ff0 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49  not permitted. I
16000 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
16010 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20  -select vector, 
16020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a  this routine .**
16030 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65   loads the Parse
16040 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d   object with a m
16050 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16060 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16070 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16080 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16090 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72  cted 1".**.** Or
160a0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67  , if it is a reg
160b0 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74  ular scalar vect
160c0 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77  or:.**.**   "row
160d0 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a   value misused".
160e0 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
160f0 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
16100 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16110 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69  Expr *pExpr){.#i
16120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16130 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
16140 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
16150 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
16160 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16170 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16180 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
16190 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
161a0 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  r, 1);.  }else.#
161b0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
161c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
161d0 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
161e0 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a   misused");.  }.
161f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16200 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16210 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16220 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ode that will co
16230 6e 73 74 72 75 63 74 20 61 6e 20 65 70 68 65 6d  nstruct an ephem
16240 65 72 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61  eral table conta
16250 69 6e 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a  ining all terms.
16260 2a 2a 20 69 6e 20 74 68 65 20 52 48 53 20 6f 66  ** in the RHS of
16270 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
16280 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
16290 72 20 63 61 6e 20 62 65 20 69 6e 20 65 69 74 68  r can be in eith
162a0 65 72 20 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72  er of two.** for
162b0 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20  ms:.**.**     x 
162c0 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
162d0 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
162e0 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
162f0 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
16300 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
16310 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
16320 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
16330 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
16340 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
16350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
16360 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16370 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
16380 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
16390 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e  r for the.** con
163a0 73 74 72 75 63 74 65 64 20 65 70 68 65 72 6d 65  structed epherme
163b0 72 61 6c 20 74 61 62 6c 65 20 69 73 20 72 65 74  ral table is ret
163c0 75 72 6e 65 64 2e 20 20 54 68 65 20 66 69 72 73  urned.  The firs
163d0 74 20 74 69 6d 65 20 74 68 65 20 65 70 68 65 6d  t time the ephem
163e0 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73  eral.** table is
163f0 20 63 6f 6d 70 75 74 65 64 2c 20 74 68 65 20 63   computed, the c
16400 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 73 20  ursor number is 
16410 61 6c 73 6f 20 73 74 6f 72 65 64 20 69 6e 20 70  also stored in p
16420 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a  Expr->iTable,.**
16430 20 68 6f 77 65 76 65 72 20 74 68 65 20 63 75 72   however the cur
16440 73 6f 72 20 6e 75 6d 62 65 72 20 72 65 74 75 72  sor number retur
16450 6e 65 64 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ned might not be
16460 20 74 68 65 20 73 61 6d 65 2c 20 61 73 20 69 74   the same, as it
16470 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 62   might.** have b
16480 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 75  een duplicated u
16490 73 69 6e 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e  sing OP_OpenDup.
164a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48  .**.** If the LH
164b0 53 20 65 78 70 72 65 73 73 69 6f 6e 20 28 22 78  S expression ("x
164c0 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
164d0 73 29 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  s) is a column v
164e0 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20  alue, or.** the 
164f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16500 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
16510 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
16520 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
16530 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20  at.** column is 
16540 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
16550 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
16560 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
16570 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73  e.** SELECT... s
16580 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16590 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
165a0 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
165b0 73 65 64 0a 2a 2a 20 69 66 20 65 69 74 68 65 72  sed.** if either
165c0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
165d0 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
165e0 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
165f0 68 65 72 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74  her.** 'x' nor t
16600 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
16610 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
16620 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
16630 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20   affinity.** is 
16640 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
16650 6c 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e  lite3CodeRhsOfIN
16660 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16670 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
16680 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16690 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
166a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
166b0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
166c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 20 20 20  /.  int iTab    
166d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
166e0 73 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 6e  se this cursor n
166f0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
16700 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 20  t addrOnce = 0; 
16710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16720 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f  ress of the OP_O
16730 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
16740 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  at top */.  int 
16750 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
16760 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16770 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
16780 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
16790 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  on */.  Expr *pL
167a0 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
167b0 20 20 20 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f      /* the LHS o
167c0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
167d0 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  r */.  KeyInfo *
167e0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
167f0 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
16800 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
16810 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
16820 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
16830 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
16840 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
16870 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
16880 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
16890 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
168a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
168b0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  v!=0 );..  /* Th
168c0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  e evaluation of 
168d0 74 68 65 20 49 4e 20 6d 75 73 74 20 62 65 20 72  the IN must be r
168e0 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
168f0 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
16900 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
16910 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16920 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
16930 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
16940 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
16950 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
16960 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
16970 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
16980 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
16990 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
169a0 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
169b0 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
169c0 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
169d0 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
169e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
169f0 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
16a00 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74  en we can comput
16a10 65 20 74 68 65 20 52 48 53 20 6a 75 73 74 20 6f  e the RHS just o
16a20 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65 75  nce.  ** and reu
16a30 73 65 20 69 74 20 6d 61 6e 79 20 6e 61 6d 65 73  se it many names
16a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
16a50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16a60 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
16a70 74 29 20 26 26 20 70 50 61 72 73 65 2d 3e 69 53  t) && pParse->iS
16a80 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  elfTab==0 ){.   
16a90 20 2f 2a 20 52 65 75 73 65 20 6f 66 20 74 68 65   /* Reuse of the
16aa0 20 52 48 53 20 69 73 20 61 6c 6c 6f 77 65 64 20   RHS is allowed 
16ab0 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  */.    /* If thi
16ac0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c  s routine has al
16ad0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64  ready been coded
16ae0 2c 20 62 75 74 20 74 68 65 20 70 72 65 76 69 6f  , but the previo
16af0 75 73 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 6d  us code.    ** m
16b00 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
16b10 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65 74 2c 20  en invoked yet, 
16b20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77  so invoke it now
16b30 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
16b40 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
16b50 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16b60 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75 62 72  y(pExpr, EP_Subr
16b70 74 6e 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64  tn) ){.      add
16b80 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
16b90 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
16ba0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
16bb0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
16bc0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16bd0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16be0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
16bf0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
16c00 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
16c10 52 45 55 53 45 20 4c 49 53 54 20 53 55 42 51 55  REUSE LIST SUBQU
16c20 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
16c30 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
16c40 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29 29  pSelect->selId))
16c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
16c80 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
16c90 65 74 75 72 6e 2c 0a 20 20 20 20 20 20 20 20 20  eturn,.         
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16cb0 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
16cc0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
16cd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16ce0 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54 61 62 2c  P_OpenDup, iTab,
16cf0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
16d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16d10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16d20 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 72  drOnce);.      r
16d30 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
16d40 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69 6e    /* Begin codin
16d50 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
16d60 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74 50   */.    ExprSetP
16d70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16d80 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20 70  P_Subrtn);.    p
16d90 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
16da0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
16db0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  ->nMem;.    pExp
16dc0 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20 3d  r->y.sub.iAddr =
16dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16de0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16df0 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70 72  nteger, 0, pExpr
16e00 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
16e10 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62 65  n) + 1;.    Vdbe
16e20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 74  Comment((v, "ret
16e30 75 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b 0a  urn address"));.
16e40 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20  .    addrOnce = 
16e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e60 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
16e70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16e80 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
16e90 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
16ea0 73 20 61 20 76 65 63 74 6f 72 20 49 4e 20 6f 70  s a vector IN op
16eb0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70 4c 65 66  erator */.  pLef
16ec0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
16ed0 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  nVal = sqlit
16ee0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
16ef0 28 70 4c 65 66 74 29 3b 0a 0a 20 20 2f 2a 20 43  (pLeft);..  /* C
16f00 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 70 68  onstruct the eph
16f10 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 68 61  emeral table tha
16f20 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  t will contain t
16f30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
16f40 2a 2a 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  ** RHS of the IN
16f50 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
16f60 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
16f70 3d 20 69 54 61 62 3b 0a 20 20 61 64 64 72 20 3d  = iTab;.  addr =
16f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f90 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
16fa0 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
16fb0 54 61 62 6c 65 2c 20 6e 56 61 6c 29 3b 0a 23 69  Table, nVal);.#i
16fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16fd0 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
16fe0 4e 54 53 0a 20 20 69 66 28 20 45 78 70 72 48 61  NTS.  if( ExprHa
16ff0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17000 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17010 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  {.    VdbeCommen
17020 74 28 28 76 2c 20 22 52 65 73 75 6c 74 20 6f 66  t((v, "Result of
17030 20 53 45 4c 45 43 54 20 25 75 22 2c 20 70 45 78   SELECT %u", pEx
17040 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
17050 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  elId));.  }else{
17060 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
17070 28 28 76 2c 20 22 52 48 53 20 6f 66 20 49 4e 20  ((v, "RHS of IN 
17080 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a 20 20 7d  operator"));.  }
17090 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65 79 49 6e  .#endif.  pKeyIn
170a0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
170b0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
170c0 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a  >db, nVal, 1);..
170d0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
170e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
170f0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
17100 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
17110 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
17120 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20   ...).    **.   
17130 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
17140 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
17150 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
17160 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
17170 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
17180 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
17190 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
171a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53 65 6c 65  .    */.    Sele
171b0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
171c0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
171d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
171e0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
171f0 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 45 78 70  pEList;..    Exp
17200 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
17210 50 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53  Parse, 1, "%sLIS
17220 54 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  T SUBQUERY %d",.
17230 20 20 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65          addrOnce
17240 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
17250 22 2c 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  ", pSelect->selI
17260 64 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 2f 2a  d.    ));.    /*
17270 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20   If the LHS and 
17280 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
17290 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61  erator do not ma
172a0 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a  tch, that.    **
172b0 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65   error will have
172c0 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e   been caught lon
172d0 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63  g before we reac
172e0 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  h this point. */
172f0 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
17300 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
17310 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 53 65  Val) ){.      Se
17320 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
17330 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
17340 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17350 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
17360 52 54 5f 53 65 74 2c 20 69 54 61 62 29 3b 0a 20  RT_Set, iTab);. 
17370 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64       dest.zAffSd
17380 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  st = exprINAffin
17390 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
173a0 72 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 65 63  r);.      pSelec
173b0 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
173c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
173d0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
173e0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
173f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17400 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
17410 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
17420 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
17430 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
17440 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
17450 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
17460 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
17470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17480 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17490 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
174a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
174b0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
174c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
174d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
174e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
174f0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
17500 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
17510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17520 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
17530 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
17540 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
17550 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
17560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
17570 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
17580 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
17590 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
175a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
175b0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
175c0 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
175d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
175e0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
175f0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
17600 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
17610 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
17620 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
17630 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
17640 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
17650 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
17660 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
17670 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , p, pEList->a[i
17680 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20  ].pExpr.        
17690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
176a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
176b0 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
176c0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f 2a  st!=0) ){.    /*
176d0 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
176e0 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
176f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
17700 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
17710 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
17720 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
17730 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
17740 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
17750 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17760 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
17770 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
17780 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 61  n use.    ** tha
17790 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
177a0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
177b0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
177c0 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
177d0 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
177e0 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
177f0 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ity..    */.    
17800 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
17810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
17820 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
17830 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
17840 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
17850 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
17860 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
17870 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17880 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
17890 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
178a0 72 33 3b 0a 20 20 20 20 61 66 66 69 6e 69 74 79  r3;.    affinity
178b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
178c0 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
178d0 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
178e0 20 29 7b 0a 20 20 20 20 20 20 61 66 66 69 6e 69   ){.      affini
178f0 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
17900 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BLOB;.    }.    
17910 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
17920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
17930 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
17940 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
17950 29 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  ) );.      pKeyI
17960 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
17970 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
17980 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
17990 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a  ->pLeft);.    }.
179a0 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
179b0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
179c0 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
179d0 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20  t>. */.    r1 = 
179e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
179f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
17a00 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
17a10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17a20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
17a30 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
17a40 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
17a50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17a60 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
17a70 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
17a80 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
17a90 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
17aa0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17ab0 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17ac0 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
17ad0 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
17ae0 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
17af0 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
17b00 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
17b10 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
17b20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
17b30 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
17b40 74 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  t.      ** expre
17b50 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
17b60 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
17b70 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
17b80 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61    */.      if( a
17b90 64 64 72 4f 6e 63 65 20 26 26 20 21 73 71 6c 69  ddrOnce && !sqli
17ba0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
17bb0 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
17bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17bd0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
17be0 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20  rOnce);.        
17bf0 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
17c00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17c10 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
17c20 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
17c30 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
17c40 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
17c50 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
17c60 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
17c70 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
17c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17c90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
17ca0 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
17cb0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
17cc0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
17cd0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
17ce0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
17cf0 69 54 61 62 2c 20 72 32 2c 20 72 33 2c 20 31 29  iTab, r2, r3, 1)
17d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17d10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17d20 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17d30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17d40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17d50 20 72 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   r2);.  }.  if( 
17d60 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17d70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17d80 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
17d90 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
17da0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a  4_KEYINFO);.  }.
17db0 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
17dc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17dd0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17de0 72 4f 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53  rOnce);.    /* S
17df0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
17e00 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
17e10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17e20 52 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79  Return, pExpr->y
17e30 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b  .sub.regReturn);
17e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17e50 43 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70  ChangeP1(v, pExp
17e60 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31  r->y.sub.iAddr-1
17e70 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
17e80 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a  rentAddr(v)-1);.
17e90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
17ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17eb0 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
17ec0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
17ed0 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
17ee0 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
17ef0 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
17f00 0a 2a 2a 20 6f 72 20 45 58 49 53 54 53 20 6f 70  .** or EXISTS op
17f10 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  erator:.**.**   
17f20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
17f30 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
17f40 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
17f50 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
17f60 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
17f70 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
17f80 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
17f90 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 53  rameter is the S
17fa0 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
17fb0 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 63  operator to be c
17fc0 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
17fd0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
17fe0 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20  lds the result. 
17ff0 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
18000 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20  umn SELECT, .** 
18010 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
18020 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
18030 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72 65  uous array of re
18040 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a  gisters and the.
18050 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
18060 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
18070 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
18080 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a   result column..
18090 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 61  ** Return 0 if a
180a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
180b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
180c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
180d0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
180e0 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
180f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
18100 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  xpr){.  int addr
18110 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Once = 0;       
18120 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18130 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70  f OP_Once at top
18140 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a   of subroutine *
18150 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
18160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18170 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
18180 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
18190 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
181b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
181c0 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
181d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
181e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
181f0 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
18200 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
18210 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
18240 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45   allocate */.  E
18250 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
18260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
18270 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69  w limit expressi
18280 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76  on */..  Vdbe *v
18290 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
182a0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
182b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
182c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
182d0 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61  ISTS );.  testca
182e0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
182f0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73  K_SELECT );.  as
18300 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
18310 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
18320 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
18330 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
18340 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18350 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18360 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d  ect) );.  pSel =
18370 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
18380 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  t;..  /* The eva
18390 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  luation of the E
183a0 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
183b0 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
183c0 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
183d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
183e0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
183f0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
18400 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
18410 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
18420 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
18430 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
18440 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
18450 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
18460 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
18470 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
18480 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
18490 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
184a0 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
184b0 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
184c0 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
184d0 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
184e0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
184f0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
18500 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
18510 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
18520 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
18530 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
18540 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
18550 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18560 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
18570 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ect) ){.    /* I
18580 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68  f this routine h
18590 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
185a0 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  coded, then invo
185b0 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a  ke it as a.    *
185c0 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f  * subroutine. */
185d0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
185e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
185f0 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
18600 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
18610 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
18620 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52 59   "REUSE SUBQUERY
18630 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49   %d", pSel->selI
18640 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d));.      sqlit
18650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18660 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d  OP_Gosub, pExpr-
18670 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e  >y.sub.regReturn
18680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18690 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
186a0 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20  >y.sub.iAddr);. 
186b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
186c0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
186d0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63  ..    /* Begin c
186e0 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  oding the subrou
186f0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  tine */.    Expr
18700 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
18710 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20  r, EP_Subrtn);. 
18720 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
18730 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
18740 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
18750 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18760 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  dr =.      sqlit
18770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18780 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
18790 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
187a0 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20  eturn) + 1;.    
187b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
187c0 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22  "return address"
187d0 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63  ));..    addrOnc
187e0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
187f0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
18800 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18810 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  v);.  }.  .  /* 
18820 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
18830 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
18840 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
18850 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
18860 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
18870 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
18880 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
18890 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
188a0 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  dex of.  ** the 
188b0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
188c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
188d0 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
188e0 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
188f0 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
18900 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
18910 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
18920 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
18930 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
18940 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  er..  **.  ** In
18950 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
18960 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
18970 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
18980 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70  1".  Any .  ** p
18990 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
189a0 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
189b0 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
189c0 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a  w LIMIT 1..  */.
189d0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
189e0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
189f0 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52  %sSCALAR SUBQUER
18a00 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61  Y %d",.        a
18a10 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52  ddrOnce?"":"CORR
18a20 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e  ELATED ", pSel->
18a30 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20  selId));.  nReg 
18a40 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
18a50 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
18a60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
18a70 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
18a80 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
18a90 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
18aa0 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  +1);.  pParse->n
18ab0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69  Mem += nReg;.  i
18ac0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18ad0 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64  _SELECT ){.    d
18ae0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18af0 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53  Mem;.    dest.iS
18b00 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
18b10 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64  rm;.    dest.nSd
18b20 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73  st = nReg;.    s
18b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18b40 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18b50 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
18b60 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
18b70 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
18b80 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
18b90 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
18ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
18bb0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18bc0 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69  Exists;.    sqli
18bd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18be0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18bf0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
18c00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18c10 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
18c20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20  result"));.  }. 
18c30 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   pLimit = sqlite
18c40 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
18c50 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
18c60 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  R,&sqlite3IntTok
18c70 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  ens[1], 0);.  if
18c80 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29  ( pSel->pLimit )
18c90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
18ca0 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
18cb0 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
18cc0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
18cd0 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
18ce0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
18cf0 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  lse{.    pSel->p
18d00 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
18d10 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
18d20 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30  LIMIT, pLimit, 0
18d30 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69  );.  }.  pSel->i
18d40 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28  Limit = 0;.  if(
18d50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18d60 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
18d70 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
18d80 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
18d90 2d 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20  ->iTable = rReg 
18da0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
18db0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
18dc0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
18dd0 6f 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20  oReduce);.  if( 
18de0 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20  addrOnce ){.    
18df0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18e00 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
18e10 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;..    /* Subrou
18e20 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20  tine return */. 
18e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18e40 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
18e50 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  n, pExpr->y.sub.
18e60 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
18e70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18e80 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e  eP1(v, pExpr->y.
18e90 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c  sub.iAddr-1, sql
18ea0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
18eb0 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a  ddr(v)-1);.  }..
18ec0 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
18ed0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
18ee0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
18ef0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
18f00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18f10 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
18f20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
18f30 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
18f40 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
18f50 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
18f60 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
18f70 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
18f80 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
18f90 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
18fa0 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
18fb0 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
18fc0 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
18fd0 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
18fe0 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
18ff0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
19000 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
19010 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
19020 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
19030 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
19040 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
19050 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
19060 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
19070 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
19080 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
19090 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
190a0 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
190b0 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
190c0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
190d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
190e0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
190f0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
19100 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
19110 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
19120 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
19130 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
19140 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
19150 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
19160 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
19170 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c  (pParse, pIn->pL
19180 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
19190 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
191a0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
191b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
191c0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
191d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
191e0 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
191f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
19200 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
19210 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
19220 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
19230 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
19240 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
19250 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
19260 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
19270 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
19280 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
19290 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
192a0 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
192b0 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
192c0 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
192d0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
192e0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
192f0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
19300 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
19310 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
19320 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
19330 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
19340 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
19350 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
19360 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
19370 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
19380 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
19390 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
193a0 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
193b0 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
193c0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
193d0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
193e0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
193f0 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
19400 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
19410 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
19420 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
19430 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
19440 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
19450 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
19460 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
19470 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
19480 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
19490 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
194a0 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
194b0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
194c0 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
194d0 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
194e0 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
194f0 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
19500 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
19510 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
19520 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
19530 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
19540 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
19550 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
19560 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
19570 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
19580 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
19590 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
195a0 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
195b0 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
195c0 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
195d0 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
195e0 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
195f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
19610 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19620 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19630 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
19640 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
19650 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19660 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
19670 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
19680 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
19690 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
196a0 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
196b0 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
196c0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
196d0 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
196e0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
196f0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
19700 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
19710 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
19720 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
19730 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
19740 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
19750 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
19760 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
19770 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
19780 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
19790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
197a0 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
197b0 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
197c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
197d0 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
197e0 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
197f0 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
19800 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
19810 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
19820 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
19830 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
19840 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
19850 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
19860 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19870 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
19880 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
19890 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
198a0 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
198b0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
198c0 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
198d0 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
198e0 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
198f0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
19900 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
19910 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
19920 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
19930 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19940 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
19950 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
19960 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
19970 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
19980 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
19990 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
199a0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
199b0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
199c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
199d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
199e0 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
199f0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19a00 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
19a10 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
19a20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
19a30 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
19a40 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
19a50 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
19a60 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
19a70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19a80 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
19a90 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
19aa0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
19ab0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
19ac0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19ad0 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
19ae0 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
19af0 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
19b00 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
19b10 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
19b20 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20  tep-6 loop */ . 
19b30 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20   int iTab = 0;  
19b40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19b50 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65  to use */..  pLe
19b60 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
19b70 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
19b80 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
19b90 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
19ba0 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
19bb0 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
19bc0 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
19bd0 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
19be0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
19bf0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
19c00 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
19c10 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
19c20 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
19c30 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
19c40 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
19c50 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
19c60 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
19c70 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19c80 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
19c90 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
19ca0 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
19cb0 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
19cc0 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
19cd0 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
19ce0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
19cf0 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
19d00 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
19d10 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
19d20 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61   with cursor iTa
19d30 62 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  b.  ** contains 
19d40 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
19d50 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
19d60 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
19d70 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
19d80 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
19d90 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
19da0 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
19db0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19dc0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19dd0 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
19de0 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
19df0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
19e00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19e10 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
19e20 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
19e30 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
19e40 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
19e50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
19e80 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
19e90 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
19ec0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
19ed0 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
19ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69                ai
19f00 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20  Map, &iTab);..  
19f10 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19f20 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
19f30 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
19f40 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
19f50 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19f60 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
19f70 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19f80 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
19f90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19fa0 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
19fb0 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
19fc0 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
19fd0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
19fe0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
19ff0 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
1a000 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a010 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1a020 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
1a030 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
1a040 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
1a050 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
1a060 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
1a070 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
1a080 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
1a090 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
1a0a0 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
1a0b0 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
1a0c0 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
1a0d0 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
1a0e0 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
1a0f0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
1a100 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
1a110 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
1a120 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
1a130 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a140 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
1a150 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
1a160 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
1a170 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
1a180 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
1a190 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
1a1a0 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
1a1b0 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
1a1c0 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
1a1d0 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
1a1e0 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
1a1f0 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
1a200 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
1a210 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
1a220 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
1a230 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
1a240 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  /.  rLhsOrig = e
1a250 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
1a260 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
1a270 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
1a280 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
1a290 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
1a2a0 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
1a2b0 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
1a2c0 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
1a2d0 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
1a2e0 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
1a2f0 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
1a300 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
1a310 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a320 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
1a330 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
1a340 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
1a350 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
1a360 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a370 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a380 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
1a390 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a3a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a3b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a3c0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
1a3d0 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
1a3e0 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
1a3f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
1a400 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a410 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
1a420 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
1a430 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
1a440 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
1a450 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
1a460 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
1a470 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
1a480 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
1a490 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
1a4a0 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
1a4b0 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
1a4c0 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
1a4d0 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
1a4e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a4f0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
1a500 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
1a510 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1a520 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
1a530 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1a540 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a550 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
1a560 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
1a570 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
1a580 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a590 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
1a5a0 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
1a5b0 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
1a5c0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
1a5d0 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
1a5e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1a5f0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1a600 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1a610 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
1a620 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1a630 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
1a640 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1a650 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1a660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a670 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
1a680 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
1a690 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
1a6a0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
1a6b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
1a6c0 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
1a6d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a6e0 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
1a6f0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
1a700 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
1a710 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
1a720 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1a730 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
1a740 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
1a750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a760 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1a770 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
1a780 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a7a0 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
1a7b0 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
1a7c0 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1a7d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a7e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a7f0 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
1a800 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1a830 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1a840 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a850 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
1a860 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1a870 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a880 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
1a890 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1a8a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a8b0 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1a8c0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1a8d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1a8e0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1a8f0 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
1a900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a910 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1a920 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
1a930 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1a960 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
1a970 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a990 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
1a9a0 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
1a9b0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1a9c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a9d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a9e0 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
1a9f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1aa00 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
1aa10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1aa30 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
1aa40 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
1aa50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1aa60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1aa70 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1aa80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1aa90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1aaa0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
1aab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1aac0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1aad0 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
1aae0 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
1aaf0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1ab00 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
1ab10 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
1ab20 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
1ab30 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
1ab40 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
1ab50 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
1ab60 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
1ab70 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1ab80 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
1ab90 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
1aba0 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
1abb0 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
1abc0 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
1abd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1abe0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1abf0 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
1ac00 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
1ac10 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
1ac20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
1ac30 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
1ac40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1ac50 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  Parse);.  }.  fo
1ac60 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1ac70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1ac80 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
1ac90 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1aca0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
1acb0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1acc0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1acd0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1ace0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1acf0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
1ad00 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
1ad10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ad20 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
1ad30 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
1ad40 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
1ad50 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1ad60 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
1ad70 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
1ad80 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
1ad90 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
1ada0 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
1adb0 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
1adc0 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
1add0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1ade0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1adf0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
1ae00 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
1ae10 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
1ae20 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
1ae30 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
1ae40 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
1ae50 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
1ae60 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
1ae70 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
1ae80 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
1ae90 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1aea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aeb0 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
1aec0 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1aed0 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
1aee0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aef0 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
1af00 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1af10 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
1af20 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
1af30 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
1af40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af50 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1af60 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
1af70 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
1af80 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
1af90 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1afa0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1afb0 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
1afc0 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
1afd0 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1afe0 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
1aff0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1b000 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1b010 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b020 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
1b040 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
1b050 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b060 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
1b070 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1b080 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
1b090 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
1b0a0 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
1b0b0 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
1b0c0 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
1b0d0 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
1b0e0 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1b0f0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1b100 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
1b110 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1b140 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1b150 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1b160 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
1b170 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
1b180 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
1b190 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
1b1a0 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
1b1b0 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
1b1c0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1b1d0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
1b1e0 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
1b1f0 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
1b200 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
1b210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b220 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
1b230 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
1b240 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b250 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
1b270 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
1b280 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1b290 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b2a0 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
1b2b0 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
1b2c0 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
1b2d0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
1b2e0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b2f0 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
1b300 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1b310 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
1b320 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
1b330 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
1b340 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
1b350 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
1b360 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
1b370 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
1b380 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
1b390 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
1b3a0 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
1b3b0 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
1b3c0 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
1b3d0 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
1b3e0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
1b3f0 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
1b400 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
1b410 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
1b420 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
1b430 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1b440 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
1b450 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b460 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
1b470 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
1b480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b490 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1b4a0 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b4b0 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1b4c0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1b4d0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1b4e0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1b4f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b500 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  bel(pParse);.  }
1b510 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
1b520 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d   nVector==1, com
1b530 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64  bine steps 6 and
1b540 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c   7 by immediatel
1b550 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  y returning.    
1b560 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
1b570 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
1b580 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   is not NULL */.
1b590 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
1b5a0 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1b5b0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1b5c0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1b5d0 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
1b5e0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1b5f0 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c      int r3 = sql
1b600 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1b610 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20  Parse);.    p = 
1b620 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1b630 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
1b640 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   i);.    pColl =
1b650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1b660 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
1b670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b680 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1b690 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29  mn, iTab, i, r3)
1b6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b6b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1b6c0 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1b6d0 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1b700 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1b710 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b720 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1b730 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b740 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1b750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b760 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1b770 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1b780 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1b790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b7a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1b7b0 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1b7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b7d0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
1b7e0 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ab, addrTop+1);.
1b7f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b800 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65  (v);..    /* Ste
1b810 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63  p 7:  If we reac
1b820 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  h this point, we
1b830 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72   know that the r
1b840 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a  esult must.    *
1b850 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20  * be false. */. 
1b860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b870 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1b880 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
1b890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
1b8a0 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  s here in order 
1b8b0 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  to return true. 
1b8c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b8d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1b8e0 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74  TruthOp);..sqlit
1b8f0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1b900 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68  ished:.  if( rLh
1b910 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71  s!=rLhsOrig ) sq
1b920 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b930 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73  Reg(pParse, rLhs
1b940 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1b950 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
1b960 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
1b970 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1b980 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
1b990 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
1b9a0 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
1b9b0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b9c0 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
1b9d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b9e0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
1b9f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ba00 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1ba10 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
1ba20 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1ba30 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1ba40 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
1ba50 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
1ba60 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
1ba70 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1ba80 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
1ba90 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
1baa0 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
1bab0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
1bac0 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
1bad0 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
1bae0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1baf0 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
1bb00 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
1bb10 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
1bb20 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
1bb30 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
1bb40 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
1bb50 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
1bb60 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
1bb70 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1bb80 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
1bb90 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
1bba0 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
1bbb0 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
1bbc0 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
1bbd0 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1bbe0 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
1bbf0 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
1bc00 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
1bc10 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
1bc20 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
1bc30 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
1bc40 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
1bc50 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1bc60 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1bc70 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
1bc80 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1bc90 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
1bca0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1bcb0 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1bcc0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1bcd0 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
1bce0 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
1bcf0 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
1bd00 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1bd10 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
1bd20 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
1bd30 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
1bd40 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
1bd50 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1bd60 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
1bd70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1bd80 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
1bd90 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
1bda0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1bdb0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
1bdc0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1bdd0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
1bde0 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
1bdf0 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
1be00 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
1be10 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
1be20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
1be30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1be40 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
1be50 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
1be60 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
1be70 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
1be80 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
1be90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1bea0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1beb0 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
1bec0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1bed0 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
1bee0 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46  ( (c==3 && !negF
1bef0 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c  lag) || (c==2) |
1bf00 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1bf10 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1bf20 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1bf30 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1bf40 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1bf50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1bf60 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1bf70 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1bf80 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1bf90 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1bfa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bfb0 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1bfc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bfd0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1bfe0 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1bff0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c000 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1c010 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1c020 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1c030 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1c040 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1c050 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1c060 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1c070 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1c080 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1c0a0 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1c0b0 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c  e = c==3 ? SMALL
1c0c0 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1c0d0 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1c0e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1c0f0 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1c100 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1c110 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1c120 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1c130 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1c140 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1c150 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1c160 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1c170 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1c180 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1c190 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1c1a0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1c1b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c1c0 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1c1d0 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c1e0 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1c1f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c200 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1c210 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c220 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1c230 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c240 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c250 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1c260 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1c270 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1c280 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1c290 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c2a0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1c2b0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1c2c0 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1c2d0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1c2e0 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1c2f0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c300 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1c310 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1c320 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1c330 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1c340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1c350 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1c360 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c370 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1c380 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1c390 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1c3a0 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a   = iTabCur + 1;.
1c3b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c3c0 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1c3d0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c3e0 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1c3f0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70  , regOut);.    p
1c400 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c410 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c420 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c430 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1c440 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1c450 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1c460 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1c490 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1c4a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1c4b0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1c4c0 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1c4d0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1c4e0 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1c4f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c500 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c510 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1c520 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1c530 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1c540 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1c550 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1c560 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1c570 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1c580 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1c590 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1c5a0 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1c5b0 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1c5c0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1c5d0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1c5e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c5f0 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1c600 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1c610 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1c620 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1c630 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1c640 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1c650 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1c660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c670 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1c680 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1c690 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1c6a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1c6b0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1c6c0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1c6d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c6e0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1c6f0 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1c700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c710 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1c720 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1c730 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1c740 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1c750 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1c760 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1c770 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1c780 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1c790 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1c7a0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1c7b0 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1c7c0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1c7d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c7e0 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1c7f0 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1c800 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1c810 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1c820 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1c830 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1c840 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c850 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1c860 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1c870 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1c880 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1c890 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1c8a0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1c8b0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1c8c0 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  iReg. .**.** The
1c8d0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1c8e0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1c8f0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1c900 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1c910 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1c920 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1c930 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1c940 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1c950 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1c960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c970 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1c980 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1c990 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1c9a0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1c9b0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1c9c0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1c9d0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c9e0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1c9f0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1ca00 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1ca10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1ca20 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1ca30 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1ca40 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1ca50 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1ca60 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1ca70 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1ca80 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1ca90 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cab0 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cac0 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cad0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cae0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1caf0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1cb00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cb10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1cb20 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1cb30 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1cb40 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1cb50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1cb60 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1cb70 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1cb80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1cb90 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
1cba0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
1cbb0 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
1cbc0 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
1cbd0 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
1cbe0 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20  nReg-1..*/.void 
1cbf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1cc00 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1cc10 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1cc20 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1cc30 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1cc40 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1cc50 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1cc60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1cc70 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1cc80 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1cc90 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1cca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1ccb0 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  t a scalar expre
1ccc0 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
1ccd0 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65  TK_REGISTER refe
1cce0 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73  rencing.** regis
1ccf0 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63  ter iReg.  The c
1cd00 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1cd10 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65  e that iReg alre
1cd20 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ady contains.** 
1cd30 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1cd40 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
1cd50 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1cd60 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
1cd70 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
1cd80 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
1cd90 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
1cda0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1cdb0 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1cdc0 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
1cdd0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
1cde0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  kip);.}../*.** E
1cdf0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1ce00 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20  ssion (either a 
1ce10 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c  vector or a scal
1ce20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61  ar expression) a
1ce30 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20  nd store.** the 
1ce40 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e  result in contin
1ce50 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20  guous temporary 
1ce60 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75  registers.  Retu
1ce70 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1ce80 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
1ce90 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74  ister used to st
1cea0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
1ceb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
1cec0 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1ced0 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1cee0 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65  rary scalar, the
1cef0 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20  n also write.** 
1cf00 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
1cf10 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65  mber into *piFre
1cf20 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72  eable.  If the r
1cf30 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1cf40 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f  egister.** is no
1cf50 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
1cf60 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1cf70 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73  on is a vector s
1cf80 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a  et *piFreeable.*
1cf90 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
1cfa0 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65  c int exprCodeVe
1cfb0 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ctor(Parse *pPar
1cfc0 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  se, Expr *p, int
1cfd0 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20   *piFreeable){. 
1cfe0 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20   int iResult;.  
1cff0 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  int nResult = sq
1d000 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
1d010 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52  ize(p);.  if( nR
1d020 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20  esult==1 ){.    
1d030 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1d040 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d050 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61  arse, p, piFreea
1d060 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1d070 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d     *piFreeable =
1d080 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   0;.    if( p->o
1d090 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
1d0a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  #if SQLITE_OMIT_
1d0b0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69  SUBQUERY.      i
1d0c0 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73  Result = 0;.#els
1d0d0 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  e.      iResult 
1d0e0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1d0f0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1d100 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1d110 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1d120 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1d130 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1d140 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1d150 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1d160 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d170 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1d180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d190 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1d1a0 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e  le(pParse, p->x.
1d1b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1d1c0 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20  r, i+iResult);. 
1d1d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d1e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c  .  return iResul
1d1f0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t;.}.../*.** Gen
1d200 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1d210 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1d220 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d230 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1d240 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1d250 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1d260 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1d270 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1d280 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1d290 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1d2a0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1d2b0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1d2c0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1d2d0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1d2e0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1d2f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1d300 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1d310 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1d320 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1d330 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1d340 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1d350 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1d360 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1d370 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1d380 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1d390 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1d3a0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1d3b0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1d3c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1d3d0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1d3e0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1d3f0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1d400 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d410 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1d420 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1d430 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1d440 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d460 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1d470 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1d480 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1d490 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1d4a0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1d4b0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1d4c0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1d4d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1d4e0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1d4f0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d500 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1d510 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1d520 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1d530 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1d540 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1d550 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d570 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1d580 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78   numbers */.  Ex
1d590 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1d5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1d5b0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1d5c0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1d5d0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d5e0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1d5f0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1d600 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1d610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d620 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1d630 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1d640 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78  eturn 0;.  }..ex
1d650 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a  pr_code_doover:.
1d660 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1d670 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1d680 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1d690 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1d6a0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1d6b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1d6c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1d6d0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1d6e0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1d6f0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1d700 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1d710 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1d720 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1d730 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1d740 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1d750 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1d760 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1d770 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1d780 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1d790 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1d7a0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1d7b0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1d7c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d7d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d7e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1d7f0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1d800 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1d830 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1d840 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1d850 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1d860 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1d870 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1d880 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1d890 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1d8a0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1d8b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1d8c0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1d8d0 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  le;.      if( Ex
1d8e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d8f0 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
1d900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1d910 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72  This COLUMN expr
1d920 65 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  ession is really
1d930 20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20   a constant due 
1d940 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  to WHERE clause.
1d950 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1d960 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74  raints, and that
1d970 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64   constant is cod
1d980 65 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d  ed by the pExpr-
1d990 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  >pLeft.        *
1d9a0 2a 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20  * expresssion.  
1d9b0 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75  However, make su
1d9c0 72 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  re the constant 
1d9d0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a  has the correct.
1d9e0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74          ** datat
1d9f0 79 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20  ype by applying 
1da00 74 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20  the Affinity of 
1da10 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1da20 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
1da30 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20  ** constant..   
1da40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1da50 69 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74  int iReg = sqlit
1da60 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1da70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1da80 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20  pLeft,target);. 
1da90 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d         int aff =
1daa0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
1dab0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  umnAffinity(pExp
1dac0 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78 70 72  r->y.pTab, pExpr
1dad0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1dae0 20 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c      if( aff!=SQL
1daf0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
1db00 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
1db10 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66   const char zAff
1db20 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30  [] = "B\000C\000
1db30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20  D\000E";.       
1db40 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1db50 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20  E_AFF_BLOB=='A' 
1db60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1db70 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f  ert( SQLITE_AFF_
1db80 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20  TEXT=='B' );.   
1db90 20 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21         if( iReg!
1dba0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1dbb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dbc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1dbd0 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67  Copy, iReg, targ
1dbe0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
1dbf0 20 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a   iReg = target;.
1dc00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dc20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
1dc30 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c  finity, iReg, 1,
1dc40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 26 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a  &zAff[(aff-'B')*
1dc70 32 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  2], P4_STATIC);.
1dc80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dc90 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20    return iReg;. 
1dca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1dcb0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1dcc0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1dcd0 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1dce0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1dcf0 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1dd00 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1dd10 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1dd20 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1dd30 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1dd40 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1dd50 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1dd60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dd70 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1dd80 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1dd90 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1dda0 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1ddb0 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1ddc0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1ddd0 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1dde0 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1ddf0 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1de00 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1de10 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1de20 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1de40 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1de50 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1de60 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1de70 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20  pr->y.pTab,.    
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1dea0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1deb0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1dee0 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1def0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1df00 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1df10 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1df20 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1df30 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1df40 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1df50 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a  se TK_TRUEFALSE:
1df60 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1df70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1df80 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  _Integer, sqlite
1df90 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
1dfa0 70 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b  pExpr), target);
1dfb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1dfc0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1dfd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dfe0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1dff0 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1e000 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e010 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e020 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e030 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e040 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1e050 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1e060 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e070 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1e090 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1e0a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e0b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e0c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e0d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1e0e0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1e0f0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1e100 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1e110 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e120 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1e130 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1e140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e150 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1e160 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1e170 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e180 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1e190 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1e1a0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1e1b0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1e1c0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1e1d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1e1e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1e1f0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1e200 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e210 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e220 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e230 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e240 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1e250 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1e260 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1e270 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e280 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1e290 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1e2a0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1e2b0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1e2c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e2d0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1e2e0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1e2f0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1e300 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1e310 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1e320 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1e330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e340 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1e350 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1e360 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1e370 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1e380 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e390 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1e3a0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1e3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e3c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e3d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e3e0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1e3f0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e400 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1e410 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e420 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1e430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1e450 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1e460 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1e470 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1e480 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1e490 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1e4a0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1e4b0 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
1e4c0 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
1e4d0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1e4e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e4f0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e500 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74  en[0]=='?' || st
1e510 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1e520 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20  oken, z)==0 );. 
1e530 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1e540 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a  VList[0] = 0; /*
1e550 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20   Indicate VList 
1e560 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  may no longer be
1e570 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20   enlarged */.   
1e580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e590 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
1e5a0 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29  r*)z, P4_STATIC)
1e5b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e5c0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e5d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e5e0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1e5f0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1e600 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23  >iTable;.    }.#
1e610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e620 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1e630 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1e640 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1e650 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1e660 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1e670 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1e680 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1e690 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1e6a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e6b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e6c0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1e6d0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1e6e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e6f0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1e700 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1e710 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1e720 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1e730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e740 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1e750 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1e780 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1e790 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1e7a0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20   return inReg;. 
1e7b0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1e7c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1e7d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
1e7e0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1e7f0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d  SNOT:.      op =
1e800 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1e810 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1e820 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f      p5 = SQLITE_
1e830 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
1e840 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f   fall-through */
1e850 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1e860 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1e870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1e880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1e890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1e8a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1e8b0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1e8c0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1e8d0 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eft;.      if( s
1e8e0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1e8f0 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  or(pLeft) ){.   
1e900 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43       codeVectorC
1e910 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1e920 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70  Expr, target, op
1e930 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , p5);.      }el
1e940 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1e950 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e960 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
1e970 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e980 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1e990 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e9a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e9b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e9c0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  2);.        code
1e9d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e9e0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1e9f0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1ea00 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1ea10 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1ea20 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1ea30 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1ea40 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1ea50 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1ea60 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ea70 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1ea80 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1ea90 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1eaa0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1eab0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1eac0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1ead0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1eae0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1eaf0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1eb00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1eb10 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1eb20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1eb30 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1eb40 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1eb50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1eb60 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1eb70 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1eb80 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1eb90 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1eba0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ebb0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1ebc0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1ebd0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1ebe0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1ebf0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ec00 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1ec10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ec20 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ec30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ec40 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1ec50 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1ec60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ec70 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1ec80 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1ec90 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1eca0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1ecb0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1ecc0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1ecd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1ece0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1ecf0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1ed00 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1ed10 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1ed20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1ed30 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1ed40 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1ed50 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1ed60 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1ed70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ed80 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1ed90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1eda0 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1edb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1edc0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1edd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ede0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1edf0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ee00 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1ee10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ee20 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1ee30 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1ee40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1ee50 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1ee60 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1ee70 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1ee80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ee90 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1eea0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1eeb0 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1eec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eed0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1eee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1eef0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1ef00 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1ef10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1ef20 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1ef30 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1ef40 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1ef50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ef60 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1ef70 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1ef80 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1ef90 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1efa0 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1efb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1efc0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1efd0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1efe0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1eff0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f000 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1f010 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1f020 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f030 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1f040 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f050 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f060 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f070 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f080 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f090 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f0a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f0b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f0d0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
1f0e0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1f0f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f100 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f120 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==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 55 4d 49  .    case TK_UMI
1f150 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
1f160 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1f170 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
1f180 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
1f190 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
1f1a0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
1f1b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
1f1c0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1f1d0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
1f1e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f1f0 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66   target;.#ifndef
1f200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1f210 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1f220 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1f230 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
1f240 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f250 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f260 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f270 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f280 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1f290 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Left->u.zToken, 
1f2a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f2b0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f2c0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
1f2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1f2e0 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
1f2f0 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
1f300 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
1f310 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
1f320 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
1f330 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
1f340 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
1f350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f360 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
1f370 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1f380 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1f390 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f3a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f3b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
1f3c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f3d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f3e0 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
1f3f0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f410 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f420 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f430 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f440 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1f450 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1f460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f470 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1f480 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1f490 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1f4a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f4b0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1f4c0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1f4d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1f4e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f4f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f500 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f510 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f520 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1f530 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f540 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1f560 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1f570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f580 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1f590 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TH: {.      int 
1f5a0 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53  isTrue;    /* IS
1f5b0 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
1f5c0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  TRUE */.      in
1f5d0 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20  t bNormal;   /* 
1f5e0 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41  IS TRUE or IS FA
1f5f0 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  LSE */.      r1 
1f600 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f610 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f620 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f630 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1f640 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f650 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54  ==0 );.      isT
1f660 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
1f670 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1f680 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1f690 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70    bNormal = pExp
1f6a0 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20  r->op2==TK_IS;. 
1f6b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1f6c0 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c  sTrue && bNormal
1f6d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f6e0 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e  e( !isTrue && bN
1f6f0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71  ormal);.      sq
1f700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1f710 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c  nt(v, OP_IsTrue,
1f720 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54   r1, inReg, !isT
1f730 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e  rue, isTrue ^ bN
1f740 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  ormal);.      br
1f750 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f760 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1f770 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1f780 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1f790 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1f7a0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1f7b0 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1f7c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1f7d0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1f7e0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1f7f0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1f800 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f810 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1f820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f830 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f840 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1f850 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f860 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f870 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f880 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f890 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f8a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f8b0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1f8c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1f8d0 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1f8e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f8f0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1f900 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f910 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f920 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1f930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f940 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1f950 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1f960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f970 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1f980 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f990 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f9a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1f9b0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1f9c0 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
1f9d0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1f9e0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
1f9f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fa00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1fa10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1fa20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1fa30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1fa40 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
1fa50 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
1fa60 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
1fa70 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1fa80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1fa90 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  rn pInfo->aFunc[
1faa0 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1fab0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1fac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fad0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1fae0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1faf0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1fb00 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1fb10 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1fb20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1fb30 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1fb40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1fb50 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1fb60 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
1fb70 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
1fb80 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1fb90 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
1fba0 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
1fbb0 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
1fbc0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1fbd0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
1fbe0 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
1fbf0 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
1fc00 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1fc10 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
1fc20 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
1fc30 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1fc40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1fc50 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1fc60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1fc70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
1fc80 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1fc90 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
1fca0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
1fcb0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
1fcc0 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1fcd0 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
1fce0 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
1fcf0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
1fd00 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
1fd10 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69   sequence */..#i
1fd20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fd30 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
1fd40 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1fd50 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fd60 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
1fd70 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
1fd80 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65  r->y.pWin->regRe
1fd90 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  sult;.      }.#e
1fda0 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1fdb0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1fdc0 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33  arse) && sqlite3
1fdd0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
1fde0 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
1fdf0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
1fe00 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
1fe10 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72  expensive. So tr
1fe20 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61  y to move consta
1fe30 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  nt functions.   
1fe40 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74       ** out of t
1fe50 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65  he inner loop, e
1fe60 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
1fe70 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f  s an extra OP_Co
1fe80 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  py. */.        r
1fe90 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1fea0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1feb0 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a  se, pExpr, -1);.
1fec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fed0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1fee0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fef0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1ff00 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1ff10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ff20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1ff30 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ff40 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ff50 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1ff60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1ff70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1ff80 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1ff90 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1ffa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ffb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ffc0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1ffd0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1ffe0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1fff0 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
20000 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
20010 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
20020 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
20030 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20040 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
20050 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
20060 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
20070 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
20080 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20090 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
200a0 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
200b0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
200c0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
200d0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
200e0 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
200f0 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
20100 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
20110 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
20120 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
20130 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
20140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20150 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
20160 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
20170 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20180 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
20190 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
201a0 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
201b0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
201c0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
201d0 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
201e0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
201f0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
20200 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
20210 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20220 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20230 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20240 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
20250 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
20260 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
20270 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20280 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20290 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
202a0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
202b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
202c0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
202d0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
202e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
202f0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
20300 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
20310 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20320 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
20330 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
20340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
20350 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20370 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20380 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
20390 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
203a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
203b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
203c0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
203d0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
203e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
203f0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
20400 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
20410 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
20420 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
20430 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
20440 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20450 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20460 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20470 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20480 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
20490 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
204a0 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
204b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
204c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
204d0 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
204e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
204f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
20500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20510 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
20520 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
20530 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
20540 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
20550 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
20560 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
20570 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
20580 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
20590 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
205a0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
205b0 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
205c0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
205d0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
205e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
205f0 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
20600 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
20610 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
20620 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
20630 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
20640 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
20650 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
20660 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20670 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
20680 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
20690 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
206a0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
206b0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
206c0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
206d0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
20700 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
20710 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
20720 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
20730 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
20740 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
20750 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20760 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
20770 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
20780 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20790 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
207a0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
207b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
207c0 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
207d0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
207e0 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
207f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20800 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
20810 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20820 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
20830 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
20840 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
20850 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
20860 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
20870 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20890 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
208a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
208b0 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
208c0 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
208d0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
208e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
208f0 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
20900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20910 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20920 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20930 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
20940 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20950 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
20960 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
20970 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
20980 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
20990 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
209a0 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
209b0 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
209c0 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
209d0 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
209e0 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
209f0 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
20a00 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
20a10 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
20a20 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
20a30 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
20a40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
20a50 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20a60 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
20a70 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
20a80 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
20a90 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
20aa0 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
20ab0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
20ac0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
20ad0 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
20ae0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
20af0 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
20b00 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20b10 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
20b20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
20b30 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
20b40 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
20b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20b60 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
20b70 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
20b80 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
20b90 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20ba0 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
20bb0 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
20bc0 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
20bd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20be0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20bf0 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
20c00 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
20c10 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
20c20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20c50 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
20c60 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
20c70 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
20c80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
20c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20ca0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
20cb0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
20cc0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
20cf0 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
20d00 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d  FACTOR);.      }
20d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
20d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
20d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20d40 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
20d50 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
20d60 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
20d70 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
20d80 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
20d90 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
20da0 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
20db0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20dc0 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
20dd0 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
20de0 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
20df0 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
20e00 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
20e10 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
20e20 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
20e30 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
20e40 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
20e50 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
20e60 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
20e70 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
20e80 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
20e90 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
20ea0 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
20eb0 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
20ec0 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
20ed0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
20ee0 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
20ef0 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
20f00 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
20f10 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
20f20 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
20f30 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
20f40 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
20f50 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
20f60 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
20f70 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
20f80 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
20f90 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
20fa0 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
20fb0 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
20fc0 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
20fd0 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
20fe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20ff0 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45  f( nFarg>=2 && E
21000 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21010 45 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75  Expr, EP_InfixFu
21020 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
21030 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21040 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
21050 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21060 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
21070 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
21080 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
21090 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
210a0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
210b0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
210c0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
210d0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
210e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
210f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
21100 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21110 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
21120 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
21130 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
21140 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
21150 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
21160 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
21170 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
21180 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
21190 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
211a0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
211b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
211c0 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20  SET_SQL_FUNC.   
211d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
211e0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
211f0 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20  FUNC_OFFSET ){. 
21200 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72         Expr *pAr
21210 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  g = pFarg->a[0].
21220 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
21230 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f  f( pArg->op==TK_
21240 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21260 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
21270 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65  et, pArg->iTable
21280 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pArg->iColumn,
21290 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
212a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
212b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
212c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
212d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
212e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
212f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
21300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21310 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70  3VdbeAddOp4(v, p
21320 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
21330 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a  ? OP_PureFunc0 :
21340 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20   OP_Function0,. 
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21360 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
21370 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20  sk, r1, target, 
21380 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
21390 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
213a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
213b0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
213c0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
213d0 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
213e0 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
213f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21400 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
21410 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
21420 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
21430 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
21440 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
21450 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21460 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
21470 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
21480 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
21490 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
214a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
214b0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
214c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
214d0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
214e0 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
214f0 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c  _SELECT && (nCol
21500 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
21510 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
21520 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  pr)!=1 ){.      
21530 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
21540 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
21550 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  nCol, 1);.      
21560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
21570 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64  eturn sqlite3Cod
21580 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
21590 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
215a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
215b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
215c0 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
215d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
215e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
215f0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
21600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
21610 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21620 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
21630 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
21640 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
21650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21660 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
21670 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
21680 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
21690 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
216a0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
216b0 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
216c0 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
216d0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
216e0 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
216f0 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
21700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21710 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
21720 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
21730 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21760 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
21770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21780 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
21790 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
217a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
217b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
217c0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
217d0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
217e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
217f0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
21800 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21810 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21820 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
21830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21840 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21850 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21870 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
21880 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
21890 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
218a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
218b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
218c0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
218d0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
218e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
218f0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
21900 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21920 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
21930 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
21940 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21950 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
21960 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
21970 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21980 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21990 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
219a0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
219b0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
219c0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
219d0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
219e0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
219f0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
21a00 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
21a10 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
21a20 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
21a30 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21a40 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21a50 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
21a60 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
21a70 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21a80 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
21a90 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
21aa0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
21ab0 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
21ac0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
21ad0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
21ae0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
21af0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
21b10 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
21b20 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
21b30 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
21b40 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
21b50 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
21b60 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64  goto expr_code_d
21b70 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30  oover; /* 2018-0
21b80 34 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65  4-28: Prevent de
21b90 65 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53  ep recursion. OS
21ba0 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a  SFuzz. */.    }.
21bb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
21bc0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
21bd0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
21be0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
21bf0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
21c00 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
21c10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
21c20 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
21c30 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
21c40 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
21c50 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
21c60 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
21c70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
21c80 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
21c90 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
21ca0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
21cb0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
21cc0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
21cd0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
21ce0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
21cf0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
21d00 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
21d10 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
21d20 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
21d30 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
21d40 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
21d50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21d60 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
21d70 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21d80 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
21d90 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
21da0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
21db0 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
21dc0 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
21dd0 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
21de0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
21df0 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
21e00 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
21e10 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
21e20 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
21e30 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
21e40 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
21e50 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
21e60 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
21e70 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
21e80 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
21e90 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
21ea0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
21eb0 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
21ec0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
21ed0 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
21ee0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
21ef0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
21f00 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
21f10 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
21f20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
21f30 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
21f40 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
21f50 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
21f60 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
21f70 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
21f80 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
21f90 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
21fa0 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
21fb0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21fc0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21fd0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
21fe0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21ff0 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
22000 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
22010 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22020 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
22030 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
22040 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
22050 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
22060 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
22070 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
22080 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
22090 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
220a0 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
220b0 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
220c0 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
220d0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
220e0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
220f0 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
22100 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
22110 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
22120 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
22130 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
22140 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
22150 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
22160 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
22170 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
22180 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22190 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
221a0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
221b0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
221c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
221d0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
221e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
221f0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
22200 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
22210 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
22220 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
22230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22240 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
22250 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
22260 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22270 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25  ((v, "r[%d]=%s.%
22280 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  s", target,.    
22290 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
222a0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
222b0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
222c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
222d0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
222e0 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ->y.pTab->aCol[p
222f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
22300 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a  Name).      ));.
22310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22320 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
22330 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
22340 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
22350 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
22360 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
22370 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
22380 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
22390 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
223a0 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
223b0 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
223c0 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
223d0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
223e0 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
223f0 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
22400 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
22410 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
22420 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
22430 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
22440 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
22450 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
22460 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
22470 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
22480 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
22490 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
224a0 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
224b0 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
224c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
224d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
224e0 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
224f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
22500 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
22510 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
22520 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
22530 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22540 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
22550 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
22560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22570 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22580 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
22590 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
225a0 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  R;.      addrINR
225b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
225c0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
225d0 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
225e0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  ble);.      inRe
225f0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
22600 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
22610 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
22620 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22630 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
22640 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
22650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22660 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
22670 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
22680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22690 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
226a0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
226b0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
226c0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
226d0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
226e0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
226f0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22700 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
22710 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
22720 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22730 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22740 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22750 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22760 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
22770 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
22780 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
22790 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
227a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
227b0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
227c0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
227d0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
227e0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
227f0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
22800 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22810 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
22820 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
22830 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
22840 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
22850 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
22860 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
22870 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
22880 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
22890 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
228a0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
228b0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
228c0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
228d0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
228e0 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
228f0 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
22900 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
22910 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
22920 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
22930 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
22940 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
22950 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22960 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
22970 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
22980 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22990 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
229a0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
229b0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
229c0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
229d0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
229e0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
229f0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
22a00 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
22a10 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
22a20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
22a30 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
22a40 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
22a50 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
22a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22a70 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
22a80 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
22a90 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
22aa0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
22ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
22ac0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
22ad0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
22ae0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
22b10 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
22b20 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
22b30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
22b60 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
22b70 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
22b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
22b90 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
22ba0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
22bb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
22bc0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
22bd0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
22be0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
22bf0 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
22c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22c10 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
22c20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
22c30 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c50 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
22c60 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
22c70 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c90 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
22ca0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
22cb0 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
22cc0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22cd0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22ce0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
22cf0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
22d00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
22d10 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22d20 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
22d30 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
22d40 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
22d50 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
22d60 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
22d70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
22d80 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
22d90 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
22da0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
22db0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
22dc0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
22dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  =0 ){.        ex
22de0 70 72 4e 6f 64 65 43 6f 70 79 28 26 74 65 6d 70  prNodeCopy(&temp
22df0 58 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 20 20  X, pX);.        
22e00 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
22e10 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
22e20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
22e30 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
22e40 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
22e50 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
22e60 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
22e70 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
22e80 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
22e90 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
22ea0 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
22eb0 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
22ec0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
22ed0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
22ee0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
22ef0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
22f00 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
22f10 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
22f20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
22f30 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
22f40 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
22f50 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
22f60 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
22f70 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
22f80 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
22f90 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
22fa0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
22fb0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
22fc0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
22fd0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
22fe0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
22ff0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23000 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23010 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23020 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23040 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23050 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23060 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23080 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23090 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
230a0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
230b0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
230c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
230d0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
230e0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
230f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23100 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23110 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23120 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
23130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23140 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23150 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23160 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23170 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23180 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23190 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
231a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
231b0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
231c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
231d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
231e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
231f0 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
23200 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
23210 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
23220 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23230 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23250 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23260 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23270 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23280 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
232a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
232b0 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
232c0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
232d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
232e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
232f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23300 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23320 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23330 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
23340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23350 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23360 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
23370 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
23380 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
23390 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
233a0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
233b0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
233c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
233d0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
233e0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
233f0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
23400 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23410 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23420 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
23430 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
23440 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
23450 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23460 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23470 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
23490 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
234a0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
234b0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
234c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
234d0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
234e0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
234f0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23500 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23510 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
23520 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23530 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23540 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23550 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
23570 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23580 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
23590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
235a0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
235b0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
235c0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
235d0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
235e0 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
235f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23600 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23620 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23630 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23640 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
23680 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23690 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
236a0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
236b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
236c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
236d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
236e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
236f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23700 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23710 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23720 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23730 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23740 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23750 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23760 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23770 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
23780 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
23790 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
237a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
237b0 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
237c0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
237d0 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
237e0 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
237f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23800 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23810 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23820 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23830 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23840 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23850 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23860 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
23870 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
23880 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
23890 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
238a0 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
238b0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
238c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
238d0 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
238e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
238f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23900 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
23910 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
23920 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
23930 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
23940 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
23950 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
23960 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
23970 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
23980 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
23990 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
239a0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
239b0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
239c0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
239d0 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
239e0 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
239f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23a00 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23a10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23a20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
23a30 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
23a40 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
23a50 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
23a60 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
23a70 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
23a80 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
23a90 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
23aa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
23ab0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
23ac0 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
23ad0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
23ae0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
23af0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
23b00 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
23b10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
23b20 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
23b30 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
23b40 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
23b50 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
23b60 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
23b70 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
23b80 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
23b90 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
23ba0 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
23bb0 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
23bc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
23bd0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
23be0 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
23bf0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
23c00 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
23c10 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
23c20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
23c30 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
23c40 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
23c50 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
23c60 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
23c70 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
23c80 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
23c90 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
23ca0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
23cb0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
23cc0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
23cd0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
23ce0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
23cf0 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
23d00 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
23d10 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
23d20 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
23d30 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
23d40 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
23d50 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
23d60 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
23d70 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
23d80 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
23d90 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
23da0 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
23db0 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
23dc0 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
23dd0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
23de0 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
23df0 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
23e00 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
23e10 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
23e20 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
23e30 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
23e40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
23e50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23e60 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
23e70 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
23e80 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
23e90 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
23ea0 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
23eb0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
23ec0 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
23ed0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
23ee0 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
23ef0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
23f00 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
23f10 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
23f20 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
23f30 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
23f40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23f50 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
23f60 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
23f70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
23f80 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
23f90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
23fa0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
23fb0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
23fc0 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
23fd0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
23fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
23ff0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24000 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
24010 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
24020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24030 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
24040 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24050 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24060 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24070 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24080 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
24090 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
240a0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
240b0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
240c0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
240d0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
240e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
240f0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
24100 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24110 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24120 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
24130 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24140 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
24150 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
24160 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
24170 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
24180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24190 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
241a0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
241b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
241c0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
241d0 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
241e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
241f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24200 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
24210 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24220 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
24230 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
24240 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
24250 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
24260 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
24270 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24280 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
24290 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
242a0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
242b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
242c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
242d0 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
242e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
242f0 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
24300 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
24310 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
24320 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
24330 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
24340 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
24350 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
24360 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
24370 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
24380 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
24390 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
243a0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
243b0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
243c0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
243d0 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
243e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
243f0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24400 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
24410 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
24420 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
24430 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
24440 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24450 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
24460 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24470 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
24480 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24490 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
244a0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
244b0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
244c0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
244d0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
244e0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
244f0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24500 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24510 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24520 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
24530 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
24540 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24550 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
24560 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
24570 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
24580 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
24590 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
245a0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
245b0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
245c0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
245d0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
245e0 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
245f0 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
24600 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24610 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
24620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24630 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24640 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24650 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
24660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24670 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24680 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
24690 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
246a0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
246b0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
246c0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
246d0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
246e0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
246f0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
24700 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
24710 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
24720 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
24730 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
24740 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
24750 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24760 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
24770 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
24780 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
24790 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
247a0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
247b0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
247c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
247d0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
247e0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
247f0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24800 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24810 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24820 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24830 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24840 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24850 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24860 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
24870 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24880 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24890 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
248a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
248b0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
248c0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
248d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
248e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
248f0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
24900 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24910 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24920 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
24930 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
24940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24950 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
24960 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
24970 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
24980 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
24990 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
249a0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
249b0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
249c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
249d0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
249e0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
249f0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
24a00 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
24a10 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
24a20 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24a30 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
24a40 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
24a50 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
24a60 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
24a70 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
24a80 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
24a90 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
24aa0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
24ab0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
24ac0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
24ad0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
24ae0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
24af0 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
24b00 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
24b10 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
24b20 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
24b30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
24b40 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
24b50 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
24b60 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
24b70 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
24b80 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
24b90 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
24ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
24bb0 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
24bc0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
24bd0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
24be0 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
24bf0 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
24c00 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
24c10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
24c20 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
24c30 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
24c40 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
24c50 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
24c60 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
24c70 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
24c80 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
24c90 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
24ca0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
24cb0 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
24cc0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
24cd0 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
24ce0 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
24cf0 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
24d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24d10 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
24d20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24d30 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
24d40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
24d50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
24d60 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
24d70 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
24d80 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
24d90 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
24da0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
24db0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
24dc0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
24dd0 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
24de0 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
24df0 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
24e00 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
24e10 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
24e20 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
24e30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24e40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
24e50 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
24e60 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
24e70 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
24e80 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
24e90 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
24ea0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
24eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
24ec0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
24ed0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
24ee0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24ef0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
24f00 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
24f10 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
24f20 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
24f30 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
24f40 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
24f50 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
24f60 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24f70 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
24f80 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
24f90 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
24fa0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
24fb0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
24fc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
24fd0 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
24fe0 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
24ff0 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
25000 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
25010 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
25020 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25030 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25040 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
25050 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
25060 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
25070 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
25080 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25090 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
250a0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
250b0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
250c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
250d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
250e0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
250f0 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
25100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25110 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
25120 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25130 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
25140 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25150 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
25160 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
25170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25180 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
25190 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
251a0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
251b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
251c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
251d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
251e0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
251f0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
25200 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
25210 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
25220 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
25230 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
25240 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
25250 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
25260 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
25270 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
25280 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
25290 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
252a0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
252b0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
252c0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
252d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
252e0 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
252f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25310 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25320 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
25330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25350 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
25360 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25370 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
25380 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
25390 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
253a0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
253b0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
253c0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
253d0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
253e0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
253f0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
25400 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
25410 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
25420 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
25430 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
25440 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
25450 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
25460 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
25470 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
25480 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
25490 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
254a0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
254b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
254c0 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
254d0 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
254e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
254f0 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
25500 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
25510 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
25520 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
25530 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
25540 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
25550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
25560 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
25570 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25580 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
25590 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
255a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
255b0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
255c0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
255d0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
255e0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
255f0 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
25600 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
25610 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
25620 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
25630 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
25640 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
25650 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
25660 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25670 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
25680 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
25690 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
256a0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
256b0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
256c0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
256d0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
256e0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
256f0 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
25700 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
25710 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
25720 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
25730 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
25740 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
25750 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
25760 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25770 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
25780 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
25790 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
257a0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
257b0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
257c0 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
257d0 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
257e0 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
257f0 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
25800 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
25810 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
25820 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25830 29 20 29 3b 0a 20 20 65 78 70 72 4e 6f 64 65 43  ) );.  exprNodeC
25840 6f 70 79 28 26 65 78 70 72 58 2c 20 70 45 78 70  opy(&exprX, pExp
25850 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 65 78 70  r->pLeft);.  exp
25860 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
25870 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
25880 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
25890 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
258a0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
258b0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
258c0 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
258d0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
258e0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
258f0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
25900 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
25910 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
25920 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
25930 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
25940 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
25950 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
25960 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
25970 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
25980 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
25990 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
259a0 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
259b0 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
259c0 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
259d0 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
259e0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
259f0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
25a00 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
25a10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
25a20 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
25a30 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
25a40 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
25a50 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
25a60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25a70 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
25a80 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
25a90 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
25aa0 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
25ab0 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
25ac0 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
25ad0 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
25ae0 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
25af0 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
25b00 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
25b10 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
25b20 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
25b30 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
25b40 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
25b50 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
25b60 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
25b70 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
25b80 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
25b90 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
25ba0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
25bb0 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
25bc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
25bd0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
25be0 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
25bf0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
25c00 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
25c10 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25c20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25c30 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
25c40 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
25c50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25c60 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25c70 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25c80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25c90 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
25ca0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25cb0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
25cc0 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
25cd0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
25ce0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
25cf0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25d00 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
25d10 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
25d20 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
25d30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25d40 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25d50 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25d60 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
25d70 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
25d80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25d90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
25da0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
25db0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
25dc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25dd0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25de0 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
25df0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
25e00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
25e10 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25e20 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25e30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25e40 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
25e50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25e60 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
25e70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25e80 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
25e90 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
25ea0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
25eb0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
25ec0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
25ed0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25ee0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
25ef0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
25f00 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
25f10 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25f20 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
25f30 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
25f40 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
25f50 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
25f60 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
25f70 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
25f80 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
25f90 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
25fa0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
25fc0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
25fd0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
25fe0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
25ff0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
26000 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
26010 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
26020 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
26030 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
26040 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
26050 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26060 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26070 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26080 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26090 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
260a0 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
260b0 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
260c0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
260d0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
260e0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
260f0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
26100 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
26110 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
26120 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
26130 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
26140 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
26150 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26160 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26170 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26180 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26190 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
261a0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
261b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
261c0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
261d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
261e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
261f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26200 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
26210 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
26220 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
26230 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26240 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26250 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26260 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26270 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26280 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26290 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
262a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
262b0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
262c0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
262d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
262e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
262f0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26300 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26320 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
26330 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
26340 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
26350 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26370 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26380 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26390 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
263a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
263b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
263c0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
263d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
263e0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
263f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
26400 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
26410 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
26420 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
26430 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
26440 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
26450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26460 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26470 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
26480 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
264a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
264b0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
264c0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
264d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
264e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
264f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26500 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
26510 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
26520 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26530 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
26540 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b        int isNot;
26550 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20        /* IS NOT 
26560 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46  TRUE or IS NOT F
26570 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ALSE */.      in
26580 74 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a  t isTrue;     /*
26590 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
265a0 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
265b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
265c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
265d0 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d    isNot = pExpr-
265e0 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a  >op2==TK_ISNOT;.
265f0 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
26600 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
26610 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
26620 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ht);.      testc
26630 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20 69  ase( isTrue && i
26640 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65  sNot );.      te
26650 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20  stcase( !isTrue 
26660 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
26670 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20 69    if( isTrue ^ i
26680 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sNot ){.        
26690 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
266a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
266b0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
266e0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
266f0 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  L : 0);.      }e
26700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
26710 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26720 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26730 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53         isNot ? S
26760 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26770 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20   : 0);.      }. 
26780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26790 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
267a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
267b0 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
267c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
267d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
267e0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
267f0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
26800 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
26810 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
26820 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
26830 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
26840 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
26850 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
26860 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
26870 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
26880 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
26890 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
268a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
268b0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
268c0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
268d0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
268e0 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
268f0 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
26900 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26910 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
26920 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26930 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
26940 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
26950 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
26960 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26970 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26980 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
26990 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
269a0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
269b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
269c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
269d0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
269e0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
269f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26a10 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
26a20 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
26a30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26a40 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
26a50 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
26a60 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
26a70 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
26a80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26a90 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
26aa0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
26ab0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
26ac0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
26ad0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
26ae0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
26af0 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
26b00 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
26b10 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
26b20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26b30 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
26b40 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
26b50 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
26b60 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
26b70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26b80 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
26b90 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26ba0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26bb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26bc0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
26bd0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
26be0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26bf0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
26c00 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
26c10 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
26c20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26c30 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
26c40 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26c50 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26c60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26c70 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26c80 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
26c90 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26cb0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26cd0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
26ce0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26cf0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
26d00 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
26d10 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
26d20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
26d30 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
26d40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26d50 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
26d60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
26d70 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
26d80 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
26d90 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
26da0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
26db0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26dc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26dd0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
26de0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
26e00 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
26e10 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26e20 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
26e30 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
26e40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26e50 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
26e60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26e70 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
26e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26e90 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
26ea0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
26eb0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26ec0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
26ed0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
26ee0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
26ef0 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
26f00 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  True, jumpIfNull
26f10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26f20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
26f30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26f40 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
26f50 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
26f60 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
26f70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
26f80 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
26f90 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
26fa0 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
26fb0 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
26fc0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
26fd0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
26fe0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
26ff0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
27000 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
27010 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
27020 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
27030 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27040 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
27050 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
27060 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27070 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
27080 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20  default_expr:.  
27090 20 20 20 20 69 66 28 20 45 78 70 72 41 6c 77 61      if( ExprAlwa
270a0 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
270b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
270c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
270d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
270e0 66 28 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c  f( ExprAlwaysFal
270f0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
27100 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
27110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27120 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27130 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27140 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
27150 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27170 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
27180 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27190 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
271a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
271b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
271c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
271d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
271e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
271f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
27200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27210 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
27220 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27230 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
27240 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
27250 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
27260 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
27270 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
27280 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
27290 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
272a0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
272b0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
272c0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
272d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
272e0 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
272f0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
27300 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
27310 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27320 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
27330 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
27340 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
27350 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
27360 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
27370 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
27380 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
27390 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
273a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
273b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
273c0 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
273d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
273e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
273f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
27400 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
27410 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
27420 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
27430 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
27440 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
27450 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
27460 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
27470 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
27480 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27490 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
274a0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
274b0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
274c0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
274d0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
274e0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
274f0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
27500 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
27510 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
27520 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
27530 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
27540 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
27550 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
27560 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
27570 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
27580 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
27590 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
275a0 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
275b0 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
275c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
275d0 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
275e0 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
275f0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
27600 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
27610 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
27620 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
27630 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
27640 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
27650 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
27660 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27680 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
27690 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
276a0 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
276b0 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
276c0 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
276d0 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
276e0 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
276f0 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
27700 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
27710 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
27720 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
27730 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
27740 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
27750 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
27760 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
27770 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
27780 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
27790 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
277a0 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
277b0 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
277c0 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
277d0 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
277e0 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
277f0 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
27800 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
27810 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
27820 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
27830 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
27840 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
27850 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
27860 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
27870 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27880 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
27890 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
278a0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
278b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
278c0 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
278d0 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
278e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
278f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
27900 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27910 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
27920 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
27930 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27940 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
27950 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
27960 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
27970 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
27980 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
27990 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
279a0 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
279b0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
279c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
279d0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
279e0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
279f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27a00 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27a10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27a20 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
27a30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27a40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27a50 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27a60 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
27a70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27a90 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
27aa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
27ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
27ac0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27ae0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27b00 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
27b10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
27b20 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
27b30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27b50 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
27b60 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27b70 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27b80 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
27b90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27ba0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
27bb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27bc0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
27bd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27be0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27c00 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27c10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27c20 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27c30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27c40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27c50 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20  _TRUTH: {.      
27c60 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20  int isNot;   /* 
27c70 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
27c80 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
27c90 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
27ca0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
27cb0 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
27cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27cd0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27ce0 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
27cf0 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
27d00 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
27d10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
27d20 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
27d30 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
27d40 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
27d50 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
27d60 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
27d70 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
27d80 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
27d90 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
27da0 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61      /* IS TRUE a
27db0 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20  nd IS NOT FALSE 
27dc0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
27dd0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27de0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27df0 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a       isNot ? 0 :
27e20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
27e30 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73  LL);..      }els
27e40 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  e{.        /* IS
27e50 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f   FALSE and IS NO
27e60 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
27e70 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27e80 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27e90 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27eb0 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
27ec0 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d  ? 0 : SQLITE_JUM
27ed0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
27ee0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27ef0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27f00 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
27f10 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
27f20 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
27f30 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
27f40 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
27f50 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
27f60 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
27f70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
27f80 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
27f90 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
27fa0 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
27fb0 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
27fc0 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
27fd0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
27fe0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
27ff0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
28000 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
28010 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
28020 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
28030 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
28040 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
28050 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
28060 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
28070 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28080 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28090 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
280a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
280b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
280c0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
280d0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
280e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
280f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28100 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
28110 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
28120 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
28130 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
28140 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
28160 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
28170 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
28180 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
28190 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
281a0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
281b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
281c0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
281d0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
281e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
281f0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
28200 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28210 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
28220 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
28230 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28240 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
28250 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
28260 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28270 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
28280 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28290 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
282a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
282b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
282c0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
282d0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
282e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
282f0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
28300 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
28310 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
28320 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28330 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28340 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
28350 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
28360 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
28370 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
28380 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28390 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
283a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
283b0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
283c0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
283d0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
283e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
283f0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
28400 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
28410 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
28420 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28430 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
28440 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
28450 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
28460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
28470 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
28480 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
28490 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
284a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
284b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
284c0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
284d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
284e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
284f0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
28500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
28510 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
28520 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28530 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
28540 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28550 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
28560 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
28570 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
28580 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
28590 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
285a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
285b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
285c0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
285d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
285e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
285f0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
28600 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
28610 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
28620 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
28630 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28650 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
28660 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
28670 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
28680 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
28690 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
286a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
286b0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
286c0 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
286d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
286e0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
286f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
28700 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
28710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28720 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
28730 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
28740 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
28750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28760 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28770 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
28780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28790 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
287a0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
287b0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
287c0 3a 20 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  : .      if( Exp
287d0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
287e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
287f0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
28800 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
28810 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77  else if( ExprAlw
28820 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
28830 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
28840 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
28850 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
28860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28870 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
28880 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
28890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
288a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
288b0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
288c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
288d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
288e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
288f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28900 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
28910 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28920 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28930 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
28940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
28950 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
28960 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
28970 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
28980 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
28990 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
289a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
289b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
289c0 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
289d0 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
289e0 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
289f0 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
28a00 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
28a10 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
28a20 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
28a30 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
28a40 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
28a50 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
28a60 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
28a70 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
28a80 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
28a90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
28aa0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
28ab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
28ac0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
28ad0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
28ae0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
28af0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
28b00 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
28b10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
28b20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28b30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28b40 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
28b50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28b60 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
28b70 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
28b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
28b90 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75  ssion pVar is gu
28ba0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
28bb0 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20  n SQL variable. 
28bc0 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79  pExpr may be any
28bd0 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72  .** type of expr
28be0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
28bf0 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
28c00 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61  le SQL value - a
28c10 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c  n integer, real,
28c20 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a   string, blob.**
28c30 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d   or NULL value -
28c40 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20 63   then the VDBE c
28c50 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
28c60 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69  repared is confi
28c70 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70  gured.** to re-p
28c80 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d 65  repare each time
28c90 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20   a new value is 
28ca0 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
28cb0 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64  e pVar..**.** Ad
28cc0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70  ditionally, if p
28cd0 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
28ce0 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74   SQL value and t
28cf0 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a  he value is the.
28d00 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  ** same as that 
28d10 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20  currently bound 
28d20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72  to variable pVar
28d30 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  , non-zero is re
28d40 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
28d50 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c  wise, if the val
28d60 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20  ues are not the 
28d70 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72  same or if pExpr
28d80 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
28d90 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a  .** SQL value, z
28da0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
28db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
28dc0 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
28dd0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
28de0 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78  , Expr *pVar, Ex
28df0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
28e00 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74  t res = 0;.  int
28e10 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33   iVar;.  sqlite3
28e20 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20  _value *pL, *pR 
28e30 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  = 0;.  .  sqlite
28e40 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
28e50 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
28e60 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
28e70 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20  QLITE_AFF_BLOB, 
28e80 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29  &pR);.  if( pR )
28e90 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56 61  {.    iVar = pVa
28ea0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
28eb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
28ec0 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
28ed0 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
28ee0 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pL = sqlite3Vdbe
28ef0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50  GetBoundValue(pP
28f00 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
28f10 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41  , iVar, SQLITE_A
28f20 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66  FF_BLOB);.    if
28f30 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  ( pL ){.      if
28f40 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
28f50 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45  type(pL)==SQLITE
28f60 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
28f70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
28f80 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65  ext(pL); /* Make
28f90 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69   sure the encodi
28fa0 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20  ng is UTF-8 */. 
28fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
28fc0 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65   =  0==sqlite3Me
28fd0 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c  mCompare(pL, pR,
28fe0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
28ff0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
29000 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pR);.    sqlite3
29010 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20  ValueFree(pL);. 
29020 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73   }..  return res
29030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
29040 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
29050 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
29060 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
29070 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
29080 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29090 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
290a0 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
290b0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
290c0 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
290d0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
290e0 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
290f0 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
29100 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
29110 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
29120 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
29130 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
29140 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
29150 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
29160 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
29170 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
29180 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
29190 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
291a0 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
291b0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
291c0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
291d0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
291e0 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
291f0 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
29200 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
29210 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
29220 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
29230 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
29240 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
29250 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
29260 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
29270 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
29280 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
29290 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
292a0 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
292b0 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
292c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
292d0 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
292e0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
292f0 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
29300 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
29310 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
29320 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
29330 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
29340 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
29350 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
29360 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
29370 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
29380 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
29390 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
293a0 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
293b0 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
293c0 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
293d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
293e0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
293f0 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
29400 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
29410 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
29420 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
29430 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
29440 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
29450 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
29460 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
29470 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
29480 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
29490 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
294a0 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
294b0 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  lfunction..**.**
294c0 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f   If pParse is no
294d0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56  t NULL then TK_V
294e0 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e  ARIABLE terms in
294f0 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67   pA with binding
29500 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  s in.** pParse->
29510 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20 62  pReprepare can b
29520 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
29530 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42  t literals in pB
29540 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73  .  The .** pPars
29550 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
29560 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64  k bitmask is upd
29570 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76 61  ated for each va
29580 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
29590 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  d..** If pParse 
295a0 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72  is NULL (the nor
295b0 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61  mal case) then a
295c0 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74  ny TK_VARIABLE t
295d0 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d  erm in .** Argum
295e0 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c  ent pParse shoul
295f0 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55  d normally be NU
29600 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  LL. If it is not
29610 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a   NULL and pA or.
29620 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20 72  ** pB causes a r
29630 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32  eturn value of 2
29640 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29650 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73  ExprCompare(Pars
29660 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29670 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
29680 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
29690 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
296a0 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
296b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
296c0 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
296d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
296e0 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b  se && pA->op==TK
296f0 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78 70  _VARIABLE && exp
29700 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
29710 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29  (pParse, pA, pB)
29720 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
29730 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
29740 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
29750 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
29760 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
29770 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
29780 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
29790 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
297a0 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
297b0 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
297c0 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
297d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
297e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
297f0 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
29800 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c  pA->op!=pB->op |
29810 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49  | pA->op==TK_RAI
29820 53 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  SE ){.    if( pA
29830 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
29840 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
29850 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
29860 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62  A->pLeft,pB,iTab
29870 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
29880 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
29890 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
298a0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
298b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
298c0 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65  arse, pA,pB->pLe
298d0 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  ft,iTab)<2 ){.  
298e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
298f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
29900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
29910 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
29920 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
29930 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
29940 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
29950 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
29960 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
29970 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
29980 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
29990 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
299a0 29 20 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e  ) return 2;.#ifn
299b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
299c0 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
299d0 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
299e0 6e 20 66 6f 72 20 74 68 65 20 61 73 73 65 72 74  n for the assert
299f0 28 29 3a 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e  ():.      ** win
29a00 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  dow functions ha
29a10 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ve p->op==TK_FUN
29a20 43 54 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67  CTION but aggreg
29a30 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  ate functions.  
29a40 20 20 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f      ** have p->o
29a50 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
29a60 4f 4e 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70  ON.  So any comp
29a70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61  arison between a
29a80 6e 20 61 67 67 72 65 67 61 74 65 0a 20 20 20 20  n aggregate.    
29a90 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e    ** function an
29aa0 64 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  d a window funct
29ab0 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ion should have 
29ac0 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65  failed before re
29ad0 61 63 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  aching.      ** 
29ae0 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64  this point.  And
29af0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
29b00 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77  ible to have a w
29b10 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
29b20 6e 64 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 63  nd.      ** a sc
29b30 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69  alar function wi
29b40 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
29b50 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61   and number of a
29b60 72 67 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20  rguments.  So.  
29b70 20 20 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61      ** if we rea
29b80 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  ch this point, e
29b90 69 74 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f  ither A and B bo
29ba0 74 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  th window functi
29bb0 6f 6e 73 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ons or.      ** 
29bc0 6e 65 69 74 68 65 72 20 61 72 65 20 61 20 77 69  neither are a wi
29bd0 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ndow functions. 
29be0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29bf0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
29c00 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d  (pA,EP_WinFunc)=
29c10 3d 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  =ExprHasProperty
29c20 28 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20  (pB,EP_WinFunc) 
29c30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
29c40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
29c50 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
29c60 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
29c70 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
29c80 70 50 61 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69  pParse,pA->y.pWi
29c90 6e 2c 70 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30  n,pB->y.pWin)!=0
29ca0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29cb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
29cc0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
29cd0 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
29ce0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
29cf0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f   }else if( pA->o
29d00 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
29d10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29d20 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75  e3_stricmp(pA->u
29d30 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
29d40 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
29d50 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
29d60 66 28 20 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e  f( ALWAYS(pB->u.
29d70 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73 74  zToken!=0) && st
29d80 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
29d90 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
29da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
29db0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
29dc0 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
29dd0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
29de0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
29df0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
29e00 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 28 63 6f  urn 2;.  if( (co
29e10 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29e20 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29  _TokenOnly)==0 )
29e30 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
29e40 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
29e50 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
29e60 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d 62  2;.    if( (comb
29e70 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 46  inedFlags & EP_F
29e80 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20  ixedCol)==0.    
29e90 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
29ea0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
29eb0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
29ec0 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
29ed0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
29ee0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29ef0 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52  e(pParse, pA->pR
29f00 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
29f10 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
29f20 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
29f30 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
29f40 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
29f50 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
29f60 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
29f70 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54     if( pA->op!=T
29f80 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20 20 26 26  K_STRING.     &&
29f90 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45   pA->op!=TK_TRUE
29fa0 46 41 4c 53 45 0a 20 20 20 20 20 26 26 20 28 63  FALSE.     && (c
29fb0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
29fc0 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 0a 20 20  P_Reduced)==0.  
29fd0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
29fe0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
29ff0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
2a000 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
2a010 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
2a020 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
2a030 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
2a040 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
2a050 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
2a060 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
2a070 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2a080 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
2a090 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
2a0a0 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
2a0b0 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
2a0c0 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
2a0d0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
2a0e0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
2a0f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
2a100 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
2a110 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
2a120 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
2a130 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
2a140 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
2a150 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
2a160 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
2a170 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
2a180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2a190 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
2a1a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
2a1b0 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
2a1c0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
2a1d0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
2a1e0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
2a1f0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
2a200 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
2a210 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
2a220 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
2a230 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
2a240 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
2a250 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
2a260 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
2a270 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
2a280 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
2a290 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
2a2a0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
2a2b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
2a2c0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
2a2d0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
2a2e0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2a2f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2a300 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
2a310 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
2a320 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2a330 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
2a340 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
2a350 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
2a360 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
2a370 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
2a380 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
2a390 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
2a3a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
2a3b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2a3c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
2a3d0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
2a3e0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2a3f0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
2a400 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
2a410 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
2a420 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
2a430 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
2a440 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a450 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
2a460 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
2a470 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
2a480 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2a490 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
2a4a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a4b0 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45  ) except COLLATE
2a4c0 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68   operators at th
2a4d0 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61  e top-level.** a
2a4e0 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  re ignored..*/.i
2a4f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2a500 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a  mpareSkip(Expr *
2a510 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
2a520 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72  t iTab){.  retur
2a530 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  n sqlite3ExprCom
2a540 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20  pare(0,.        
2a550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a560 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c  SkipCollate(pA),
2a570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2a580 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2a590 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20  late(pB),.      
2a5a0 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a         iTab);.}.
2a5b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2a5c0 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
2a5d0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
2a5e0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
2a5f0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
2a600 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2a610 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
2a620 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
2a630 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
2a640 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
2a650 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
2a660 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
2a670 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
2a680 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
2a690 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2a6a0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
2a6b0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2a6c0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
2a6d0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
2a6e0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
2a6f0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
2a700 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2a710 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
2a720 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2a730 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
2a740 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2a750 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
2a760 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2a770 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2a780 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
2a790 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
2a7a0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2a7b0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2a7c0 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
2a7d0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2a7e0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
2a7f0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
2a800 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
2a810 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
2a820 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
2a830 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
2a840 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
2a850 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
2a860 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
2a870 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  ab..**.** If pPa
2a880 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  rse is not NULL,
2a890 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
2a8a0 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
2a8b0 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a  les in pE1 are .
2a8c0 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  ** compared agai
2a8d0 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  nst literal valu
2a8e0 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50  es in pE2 and pP
2a8f0 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2a900 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66  mask is.** modif
2a910 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68  ied to record wh
2a920 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62  ich bound variab
2a930 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63  les are referenc
2a940 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a  ed.  If pParse .
2a950 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ** is NULL, then
2a960 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72   false will be r
2a970 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63  eturned if pE1 c
2a980 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e  ontains any boun
2a990 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  d variables..**.
2a9a0 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
2a9b0 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
2a9c0 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
2a9d0 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
2a9e0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
2a9f0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
2aa00 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
2aa10 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
2aa20 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
2aa30 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
2aa40 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
2aa50 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
2aa60 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
2aa70 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
2aa80 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2aa90 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2aaa0 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
2aab0 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
2aac0 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
2aad0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2aae0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20  arse, pE1, pE2, 
2aaf0 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
2ab00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2ab10 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2ab20 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
2ab30 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2ab40 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2ab50 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2ab70 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2ab80 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
2ab90 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
2aba0 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
2abb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2abc0 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2abd0 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31  K_NOTNULL && pE1
2abe0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
2abf0 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  && pE1->op!=TK_I
2ac00 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  S ){.    Expr *p
2ac10 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  X = sqlite3ExprS
2ac20 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e  kipCollate(pE1->
2ac30 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74  pLeft);.    test
2ac40 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70  case( pX!=pE1->p
2ac50 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Left );.    if( 
2ac60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ac70 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70  re(pParse, pX, p
2ac80 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
2ac90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2aca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2acb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2acc0 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63   the Expr node c
2acd0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
2ace0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f  te3ExprImpliesNo
2acf0 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49  tNullRow()..** I
2ad00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2ad10 20 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74   node requires t
2ad20 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74  hat the table at
2ad30 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a   pWalker->iCur.*
2ad40 2a 20 68 61 76 65 20 6f 6e 65 20 6f 72 20 6d 6f  * have one or mo
2ad50 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75  re non-NULL colu
2ad60 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61  mn, then set pWa
2ad70 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31  lker->eCode to 1
2ad80 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a   and abort..**.*
2ad90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2ada0 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f 70 74 69 6d  ontrols an optim
2adb0 69 7a 61 74 69 6f 6e 2e 20 20 46 61 6c 73 65 20  ization.  False 
2adc0 70 6f 73 69 74 69 76 65 73 20 28 73 65 74 74 69  positives (setti
2add0 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65  ng.** pWalker->e
2ade0 43 6f 64 65 20 74 6f 20 31 20 77 68 65 6e 20 69  Code to 1 when i
2adf0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 29  t should not be)
2ae00 20 61 72 65 20 64 65 61 64 6c 79 2c 20 62 75 74   are deadly, but
2ae10 20 66 61 6c 73 65 2d 6e 65 67 61 74 69 76 65 73   false-negatives
2ae20 0a 2a 2a 20 28 6e 65 76 65 72 20 73 65 74 74 69  .** (never setti
2ae30 6e 67 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  ng pWalker->eCod
2ae40 65 29 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  e) is a harmless
2ae50 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2ae60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2ae70 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75  int impliesNotNu
2ae80 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57  llRow(Walker *pW
2ae90 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2aea0 70 72 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  pr){.  testcase(
2aeb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2aec0 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74  GG_COLUMN );.  t
2aed0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2aee0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2aef0 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ION );.  if( Exp
2af00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2af10 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2af20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72   ) return WRC_Pr
2af30 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  une;.  switch( p
2af40 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2af50 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
2af60 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a     case TK_NOT:.
2af70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
2af80 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2af90 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  NOTNULL:.    cas
2afa0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
2afb0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
2afc0 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20 20 63  e TK_CASE:.    c
2afd0 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
2afe0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
2aff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b000 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2b010 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  SNOT );.      te
2b020 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b030 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
2b040 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b050 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pr->op==TK_ISNUL
2b060 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
2b070 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b080 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
2b090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b0a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
2b0b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b0c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b0d0 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
2b0e0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b0f0 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20 20  =TK_CASE );.    
2b100 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b110 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
2b120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b130 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
2b140 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
2b150 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b160 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
2b170 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  LUMN:.      if( 
2b180 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 3d  pWalker->u.iCur=
2b190 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
2b1a0 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
2b1b0 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2b1c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b1d0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2b1e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b1f0 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20  _Prune;..    /* 
2b200 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61  Virtual tables a
2b210 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
2b220 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69  e constraints li
2b230 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20  ke x=NULL.  So. 
2b240 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20     ** a term of 
2b250 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65  the form x=y doe
2b260 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  s not prove that
2b270 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69   y is not null i
2b280 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  f x.    ** is th
2b290 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69  e column of a vi
2b2a0 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
2b2b0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
2b2c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
2b2d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2b2e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
2b2f0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
2b300 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
2b310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b320 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
2b330 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b340 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b350 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
2b360 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b370 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
2b380 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b390 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ->op==TK_LE );. 
2b3a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b3b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
2b3c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b3d0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b3e0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _GE );.      if(
2b3f0 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
2b400 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2b410 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72   IsVirtual(pExpr
2b420 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54 61 62 29  ->pLeft->y.pTab)
2b430 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  ).       || (pEx
2b440 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pr->pRight->op==
2b450 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2b460 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52  irtual(pExpr->pR
2b470 69 67 68 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20  ight->y.pTab)). 
2b480 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72       ){.       r
2b490 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2b4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66  .      }.    def
2b4b0 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
2b4c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2b4d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2b4e0 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a  turn true (non-z
2b4f0 65 72 6f 29 20 69 66 20 65 78 70 72 65 73 73 69  ero) if expressi
2b500 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65  on p can only be
2b510 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73   true if at leas
2b520 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  t.** one column 
2b530 6f 66 20 74 61 62 6c 65 20 69 54 61 62 20 69 73  of table iTab is
2b540 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f   non-null.  In o
2b550 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
2b560 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78  rn true.** if ex
2b570 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20  pression p will 
2b580 61 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f  always be NULL o
2b590 72 20 66 61 6c 73 65 20 69 66 20 65 76 65 72 79  r false if every
2b5a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a   column of iTab.
2b5b0 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
2b5c0 2a 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65  * False negative
2b5d0 73 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65  s are acceptable
2b5e0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2b5f0 73 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72  s, it is ok to r
2b600 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76  eturn.** zero ev
2b610 65 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  en if expression
2b620 20 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65   p will never be
2b630 20 74 72 75 65 20 6f 66 20 65 76 65 72 79 20 63   true of every c
2b640 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a  olumn of iTab.**
2b650 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c   is NULL.  A fal
2b660 73 65 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d  se negative is m
2b670 65 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f  erely a missed o
2b680 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f  ptimization oppo
2b690 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46  rtunity..**.** F
2b6a0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 61  alse positives a
2b6b0 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20  re not allowed, 
2b6c0 68 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73  however.  A fals
2b6d0 65 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72  e positive may r
2b6e0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69  esult.** in an i
2b6f0 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
2b700 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
2b710 70 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65  p that are marke
2b720 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f  d with EP_FromJo
2b730 69 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68  in (and hence th
2b740 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20  at come from.** 
2b750 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b760 63 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20  clauses of LEFT 
2b770 4a 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75  JOINS) are exclu
2b780 64 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61  ded from the ana
2b790 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lysis..**.** Thi
2b7a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2b7b0 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20  d to check if a 
2b7c0 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65  LEFT JOIN can be
2b7d0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a   converted into.
2b7e0 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a  ** an ordinary J
2b7f0 4f 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75  OIN.  The p argu
2b800 6d 65 6e 74 20 69 73 20 74 68 65 20 57 48 45 52  ment is the WHER
2b810 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  E clause.  If th
2b820 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  e WHERE.** claus
2b830 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
2b840 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  some column of t
2b850 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2b860 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a  f the LEFT JOIN.
2b870 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  ** be non-NULL, 
2b880 74 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f  then the LEFT JO
2b890 49 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  IN can be safely
2b8a0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2b8b0 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a  an.** ordinary j
2b8c0 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oin..*/.int sqli
2b8d0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f  te3ExprImpliesNo
2b8e0 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70  nNullRow(Expr *p
2b8f0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57  , int iTab){.  W
2b900 61 6c 6b 65 72 20 77 3b 0a 20 20 70 20 3d 20 73  alker w;.  p = s
2b910 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2b920 6c 6c 61 74 65 28 70 29 3b 0a 20 20 77 68 69 6c  llate(p);.  whil
2b930 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
2b940 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  p->op==TK_NOTNUL
2b950 4c 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  L ){.      p = p
2b960 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d 65 6c  ->pLeft;.    }el
2b970 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
2b980 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 69 66  _AND ){.      if
2b990 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
2b9a0 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70  liesNonNullRow(p
2b9b0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
2b9c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2b9d0 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2b9e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b9f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ba00 7d 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  }.  w.xExprCallb
2ba10 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74  ack = impliesNot
2ba20 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65  NullRow;.  w.xSe
2ba30 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2ba40 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2ba50 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
2ba60 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75  eCode = 0;.  w.u
2ba70 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  .iCur = iTab;.  
2ba80 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2ba90 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
2baa0 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
2bab0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2bac0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2bad0 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2bae0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2baf0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72  lker.** to deter
2bb00 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65  mine if an expre
2bb10 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61  ssion can be eva
2bb20 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65  luated by refere
2bb30 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  nce to the.** in
2bb40 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75  dex only, withou
2bb50 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61  t having to do a
2bb60 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
2bb70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
2bb80 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54   table entry.  T
2bb90 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78  he IdxCover.pIdx
2bba0 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e   field is the in
2bbb0 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69  dex.  IdxCover.i
2bbc0 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75  Cur.** is the cu
2bbd0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
2bbe0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64  le..*/.struct Id
2bbf0 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78  xCover {.  Index
2bc00 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54   *pIdx;     /* T
2bc10 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2bc20 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61  ested for covera
2bc30 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ge */.  int iCur
2bc40 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
2bc50 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2bc60 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
2bc70 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
2bc80 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ex */.};../*.** 
2bc90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2bca0 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65  there are refere
2bcb0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2bcc0 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61  in table .** pWa
2bcd0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2bce0 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73  r->iCur can be s
2bcf0 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74  atisfied using t
2bd00 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c  he index.** pWal
2bd10 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2bd20 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  ->pIdx..*/.stati
2bd30 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76  c int exprIdxCov
2bd40 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
2bd50 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2bd60 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2bd70 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
2bd80 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
2bd90 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  ==pWalker->u.pId
2bda0 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20  xCover->iCur.   
2bdb0 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  && sqlite3Column
2bdc0 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d  OfIndex(pWalker-
2bdd0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
2bde0 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  dx, pExpr->iColu
2bdf0 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70  mn)<0.  ){.    p
2be00 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2be10 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  1;.    return WR
2be20 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
2be30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2be40 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
2be50 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64  ermine if an ind
2be60 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65  ex pIdx on table
2be70 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
2be80 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a  r contains will.
2be90 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
2bea0 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e  n pExpr.  Return
2beb0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64   true if the ind
2bec0 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68  ex does cover th
2bed0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2bee0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
2bef0 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2bf00 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62  n references tab
2bf10 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68  le columns.** th
2bf20 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64  at are not found
2bf30 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49   in the index pI
2bf40 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64  dx..**.** An ind
2bf50 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65  ex covering an e
2bf60 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20  xpression means 
2bf70 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
2bf80 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76  ion can be.** ev
2bf90 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e  aluated using on
2bfa0 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ly the index and
2bfb0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
2bfc0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a  to lookup the.**
2bfd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2bfe0 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69  able entry..*/.i
2bff0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2c000 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20  veredByIndex(.  
2c010 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
2c020 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2c030 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f   to be tested */
2c040 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
2c050 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2c060 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2c070 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2c080 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64  g table */.  Ind
2c090 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2c0a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
2c0b0 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  at might be used
2c0c0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2c0d0 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
2c0e0 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65    struct IdxCove
2c0f0 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74  r xcov;.  memset
2c100 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
2c110 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20  ));.  xcov.iCur 
2c120 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70  = iCur;.  xcov.p
2c130 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e  Idx = pIdx;.  w.
2c140 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2c150 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20  exprIdxCover;.  
2c160 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20  w.u.pIdxCover = 
2c170 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33  &xcov;.  sqlite3
2c180 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2c190 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77  pr);.  return !w
2c1a0 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  .eCode;.}.../*.*
2c1b0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c1c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c1d0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2c1e0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2c1f0 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20  ker.** to count 
2c200 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
2c210 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ble columns in t
2c220 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  he arguments of 
2c230 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  an .** aggregate
2c240 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72   function, in or
2c250 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
2c260 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
2c270 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29  unctionThisSrc()
2c280 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
2c290 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20  uct SrcCount {. 
2c2a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2c2b0 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75    /* One particu
2c2c0 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  lar FROM clause 
2c2d0 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72  in a nested quer
2c2e0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73  y */.  int nThis
2c2f0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c300 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2c310 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53  to columns in pS
2c320 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  rcList */.  int 
2c330 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20  nOther;      /* 
2c340 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2c350 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2c360 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  in other FROM cl
2c370 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  auses */.};../*.
2c380 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
2c390 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2c3a0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  s to columns..*/
2c3b0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2c3c0 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20  SrcCount(Walker 
2c3d0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2c3e0 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65  pExpr){.  /* The
2c3f0 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20   NEVER() on the 
2c400 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62  second term is b
2c410 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75  ecause sqlite3Fu
2c420 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2c430 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61  c().  ** is alwa
2c440 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
2c450 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c460 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2c470 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20  and so the.  ** 
2c480 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20  TK_COLUMNs have 
2c490 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e  not yet been con
2c4a0 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41  verted into TK_A
2c4b0 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20  GG_COLUMN.  If. 
2c4c0 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74   ** sqlite3Funct
2c4d0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2c4e0 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65   is used differe
2c4f0 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75  ntly in the futu
2c500 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56  re, the.  ** NEV
2c510 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74  ER() will need t
2c520 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  o be removed. */
2c530 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2c540 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e  ==TK_COLUMN || N
2c550 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  EVER(pExpr->op==
2c560 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29  TK_AGG_COLUMN) )
2c570 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2c580 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
2c590 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
2c5a0 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20  .pSrcCount;.    
2c5b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
2c5c0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74  p->pSrc;.    int
2c5d0 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70   nSrc = pSrc ? p
2c5e0 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20  Src->nSrc : 0;. 
2c5f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
2c600 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2c610 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2c620 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  e==pSrc->a[i].iC
2c630 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
2c640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
2c650 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
2c660 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
2c670 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
2c680 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
2c690 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2c6a0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2c6b0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2c6c0 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
2c6d0 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
2c6e0 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
2c6f0 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
2c700 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2c710 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
2c720 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2c730 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
2c740 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
2c750 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
2c760 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
2c770 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2c780 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
2c790 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
2c7a0 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
2c7b0 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
2c7c0 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
2c7d0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2c7e0 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
2c7f0 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
2c800 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
2c810 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2c820 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
2c830 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2c840 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2c850 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  ION );.  w.xExpr
2c860 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
2c870 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65  rcCount;.  w.xSe
2c880 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2c890 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
2c8a0 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
2c8b0 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
2c8c0 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
2c8d0 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
2c8e0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
2c8f0 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
2c900 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2c910 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
2c920 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
2c930 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
2c940 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2c950 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2c960 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
2c970 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2c980 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2c990 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2c9a0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2c9b0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2c9c0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2c9d0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
2c9e0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
2c9f0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
2ca00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
2ca10 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
2ca20 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2ca30 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
2ca40 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
2ca50 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2ca60 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
2ca70 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
2ca80 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
2ca90 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2caa0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
2cab0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2cac0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2cad0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
2cae0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2caf0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2cb00 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2cb10 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2cb20 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2cb30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2cb40 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
2cb50 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2cb60 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2cb70 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2cb80 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
2cb90 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2cba0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
2cbb0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
2cbc0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2cbd0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
2cbe0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
2cbf0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
2cc00 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2cc10 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
2cc20 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
2cc30 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
2cc40 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
2cc50 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
2cc60 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
2cc70 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2cc80 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
2cc90 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2cca0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
2ccb0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2ccc0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
2ccd0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2cce0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
2ccf0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2cd00 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
2cd10 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
2cd20 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
2cd30 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
2cd40 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
2cd50 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
2cd60 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
2cd70 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
2cd80 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
2cd90 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b  C->uNC.pAggInfo;
2cda0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ..  assert( pNC-
2cdb0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41  >ncFlags & NC_UA
2cdc0 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74  ggInfo );.  swit
2cdd0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2cde0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2cdf0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
2ce00 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
2ce10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ce20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2ce30 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2ce40 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2ce50 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2ce60 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
2ce70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2ce80 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
2ce90 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
2cea0 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
2ceb0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
2cec0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2ced0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
2cee0 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
2cef0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
2cf00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2cf10 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
2cf20 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
2cf30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
2cf40 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2cf50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2cf60 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2cf70 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
2cf80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cf90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2cfa0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2cfb0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2cfc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2cfd0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2cfe0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2cff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2d000 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2d010 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
2d020 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
2d030 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
2d040 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2d050 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
2d060 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2d070 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2d080 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
2d090 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
2d0a0 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
2d0b0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
2d0c0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2d0d0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
2d0e0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2d0f0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
2d100 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
2d110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d120 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
2d130 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
2d140 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
2d150 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
2d160 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
2d170 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
2d180 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
2d190 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2d1a0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2d1b0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2d1c0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d1d0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2d1e0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2d1f0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d210 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2d220 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d230 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
2d240 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
2d250 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
2d260 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
2d270 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2d280 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
2d290 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2d2a0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
2d2b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d2d0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
2d2e0 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
2d2f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
2d300 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
2d310 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
2d320 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2d330 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
2d340 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2d350 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
2d360 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d380 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2d390 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2d3a0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
2d3b0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2d3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
2d3d0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
2d3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d3f0 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
2d400 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2d410 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
2d420 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d440 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2d450 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
2d460 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
2d470 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
2d480 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2d490 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2d4a0 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
2d4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d4c0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2d4d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4f0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
2d500 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
2d510 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2d520 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2d530 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
2d540 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2d550 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d570 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2d580 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2d590 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d5a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2d5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d5e0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2d5f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
2d600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d610 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2d620 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
2d630 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
2d640 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
2d650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d670 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
2d680 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
2d690 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
2d6a0 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
2d6b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
2d6c0 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
2d6d0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
2d6e0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
2d6f0 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
2d700 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
2d710 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
2d720 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
2d730 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
2d740 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
2d750 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
2d760 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
2d770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d780 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2d790 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2d7a0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2d7b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d7c0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2d7d0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
2d7e0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
2d7f0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
2d800 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2d810 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
2d820 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d830 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
2d840 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
2d850 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2d860 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
2d870 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
2d880 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
2d890 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2d8a0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2d8b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2d8c0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
2d8d0 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
2d8e0 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
2d8f0 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
2d900 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
2d910 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
2d920 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
2d930 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2d940 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
2d950 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
2d960 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
2d970 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
2d980 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
2d990 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2d9a0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
2d9b0 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
2d9c0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2d9d0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
2d9e0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
2d9f0 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
2da00 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2da10 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
2da20 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2da30 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2da40 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d  Compare(0, pItem
2da50 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
2da60 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2da70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2da80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2daa0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
2dab0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
2dac0 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
2dad0 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
2dae0 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
2daf0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
2db00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2db10 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
2db20 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
2db30 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
2db40 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
2db50 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
2db60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2db70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2db80 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2db90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2dba0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2dbb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2dbc0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
2dbd0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
2dbe0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2dbf0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2dc00 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2dc10 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2dc20 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2dc30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2dc40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2dc50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
2dc60 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2dc70 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
2dc80 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
2dc90 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcb0 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
2dcc0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
2dcd0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
2dce0 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
2dcf0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
2dd00 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
2dd10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2dd20 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
2dd30 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2dd40 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2dd50 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
2dd60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2dd70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2dd90 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2dda0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2ddb0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ddd0 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
2dde0 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
2ddf0 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
2de00 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
2de10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2de20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2de30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2de40 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2de50 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2de60 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2de70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2de80 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2de90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2dea0 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
2deb0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2dec0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2ded0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2dee0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2def0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2df00 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2df10 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2df20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2df30 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2df40 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2df50 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2df60 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
2df70 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2df80 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2df90 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2dfa0 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2dfb0 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20  alkerDepth++;.  
2dfc0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2dfd0 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  nue;.}.static vo
2dfe0 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  id analyzeAggreg
2dff0 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28  atesInSelectEnd(
2e000 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2e010 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2e020 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e030 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2e040 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2e050 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  rDepth--;.}../*.
2e060 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
2e070 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2e080 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
2e090 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2e0a0 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
2e0b0 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
2e0c0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
2e0d0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
2e0e0 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
2e0f0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
2e100 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
2e110 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
2e120 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
2e130 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
2e140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e150 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
2e160 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
2e170 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2e180 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
2e190 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
2e1a0 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
2e1b0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2e1c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e1d0 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
2e1e0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
2e1f0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
2e200 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2e210 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2e220 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
2e230 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2e240 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e250 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78  sInSelect;.  w.x
2e260 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2e270 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2e280 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a  tesInSelectEnd;.
2e290 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20    w.walkerDepth 
2e2a0 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  = 0;.  w.u.pNC =
2e2b0 20 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73 65   pNC;.  w.pParse
2e2c0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2e2d0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
2e2e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
2e2f0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
2e300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
2e310 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2e320 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
2e330 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
2e340 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
2e350 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
2e360 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2e370 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
2e380 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
2e390 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
2e3a0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
2e3b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2e3c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e3d0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
2e3e0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
2e3f0 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
2e400 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2e410 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
2e420 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2e430 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
2e440 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
2e450 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2e460 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2e470 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2e480 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
2e490 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
2e4a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2e4b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2e4c0 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
2e4d0 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
2e4e0 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
2e4f0 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
2e500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2e510 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2e520 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
2e530 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
2e540 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2e550 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
2e570 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
2e580 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e590 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
2e5a0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
2e5b0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
2e5c0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
2e5d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
2e5e0 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64  purpose..*/.void
2e5f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2e600 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2e610 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
2e620 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
2e630 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
2e640 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
2e650 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
2e660 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
2e670 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
2e680 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
2e690 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2e6a0 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
2e6b0 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
2e6c0 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
2e6d0 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e  registers..*/.in
2e6e0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2e6f0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2e700 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
2e710 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
2e720 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75  ( nReg==1 ) retu
2e730 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  rn sqlite3GetTem
2e740 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2e750 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
2e760 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
2e770 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
2e780 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
2e790 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2e7a0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
2e7b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2e7c0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
2e7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
2e7e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2e7f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2e800 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
2e810 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
2e820 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2e830 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2e840 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2e850 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2e860 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
2e870 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2e880 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2e890 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72  iReg);.    retur
2e8a0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  n;.  }.  if( nRe
2e8b0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2e8c0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2e8d0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2e8e0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2e8f0 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2e900 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2e910 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2e920 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2e930 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2e940 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2e950 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2e960 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2e970 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2e980 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e990 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2e9a0 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2e9b0 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2e9c0 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2e9d0 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2e9e0 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2e9f0 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2ea00 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2ea10 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2ea20 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2ea30 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2ea40 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2ea50 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ea60 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2ea70 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2ea80 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2ea90 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2eaa0 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2eab0 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2eac0 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2ead0 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2eae0 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2eaf0 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a  ngeReg > iFirst.
2eb00 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2eb10 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74  angeReg <= iLast
2eb20 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
2eb30 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
2eb40 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
2eb50 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
2eb60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
2eb70 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
2eb80 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
2eb90 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
2eba0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ebb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2ebc0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2ebd0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2ebe0 47 20 2a 2f 0a                                   G */.