/ Hex Artifact Content
Login

Artifact d18469f0b1caf8f6835c29397c0e1723d1693d8665f462121834b39f3eb02ff6:


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 28 6f 70 3d 3d 54 4b 5f      if( (op==TK_
1230: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
1240: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1250: 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f        || op==TK_
1260: 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d  REGISTER || op==
1270: 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  TK_TRIGGER).    
1280: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
1290: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
12a0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
12b0: 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30   && p->y.pTab!=0
12c0: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70 45   happens when pE
12d0: 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  xpr was original
12e0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54 4b  ly.      ** a TK
12f0: 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20  _COLUMN but was 
1300: 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75  previously evalu
1310: 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20  ated and cached 
1320: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  in a register */
1330: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1340: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1350: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1360: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1370: 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 79 2e 70 54  *zColl = p->y.pT
1380: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1390: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
13a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
13b0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
13c0: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
13d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13f0: 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20   op==TK_CAST || 
1400: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op==TK_UPLUS ){.
1410: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
1420: 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ft;.      contin
1430: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1440: 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ( op==TK_COLLATE
1450: 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49   || (op==TK_REGI
1460: 53 54 45 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d  STER && p->op2==
1470: 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20  TK_COLLATE) ){. 
1480: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1490: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
14a0: 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20  Parse, ENC(db), 
14b0: 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  0, p->u.zToken);
14c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
14e0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
14f0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
1500: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1510: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1520: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1530: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1540: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1550: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1560: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1570: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1580: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1590: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
15a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
15b0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
15c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
15d0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
15e0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
15f0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
1600: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1610: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1620: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1630: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1640: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1650: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1660: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1670: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1680: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1690: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
16a0: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
16b0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
16c0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
16d0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
16e0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
16f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
1700: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1710: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1720: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1730: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1740: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1750: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1760: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1770: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1780: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1790: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
17b0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
17c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
17f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1810: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1820: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1840: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1850: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1860: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1870: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1880: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1890: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ll;.}../*.** Ret
18a0: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  urn the collatio
18b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
18c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
18d0: 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65  xpr. If.** there
18e0: 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63   is no defined c
18f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1900: 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
1910: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65  ter to the.** de
1920: 66 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20  fautl collation 
1930: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
1940: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
1950: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a  3ExprCollSeq().*
1960: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1970: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f  ExprCollSeq() ro
1980: 75 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20  utine works the 
1990: 73 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74  same except that
19a0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e   it.** returns N
19b0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
19c0: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
19d0: 74 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  tion..*/.CollSeq
19e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43   *sqlite3ExprNNC
19f0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
1a00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a10: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
1a20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
1a40: 78 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  xpr);.  if( p==0
1a50: 20 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64   ) p = pParse->d
1a60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1a70: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1a80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1a90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1aa0: 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1ab0: 65 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75  essions have equ
1ac0: 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  ivalent collatin
1ad0: 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a  g sequences..*/.
1ae0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1af0: 6f 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73  ollSeqMatch(Pars
1b00: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b10: 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29  *pE1, Expr *pE2)
1b20: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1b30: 6c 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ll1 = sqlite3Exp
1b40: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
1b50: 65 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53  e, pE1);.  CollS
1b60: 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c  eq *pColl2 = sql
1b70: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
1b80: 71 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  q(pParse, pE2);.
1b90: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ba0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e  StrICmp(pColl1->
1bb0: 7a 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a  zName, pColl2->z
1bc0: 4e 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Name)==0;.}../*.
1bd0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
1be0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
1bf0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c00: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
1c10: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
1c20: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
1c30: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1c40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
1c50: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
1c60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
1c70: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
1c80: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1c90: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
1ca0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1cc0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
1cd0: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
1ce0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
1cf0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
1d00: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
1d10: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
1d20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
1d30: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
1d40: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
1d50: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
1d60: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
1d70: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
1d80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1d90: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
1da0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
1db0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
1dc0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
1dd0: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
1de0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
1df0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
1e00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e10: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1e20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1e30: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
1e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
1e50: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
1e60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
1e70: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
1e80: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
1e90: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
1ea0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1eb0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
1ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ed0: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
1ee0: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
1ef0: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
1f00: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
1f10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1f20: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
1f30: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
1f40: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
1f50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
1f60: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
1f70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
1f80: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
1f90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
1fa0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
1fb0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
1fc0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
1fd0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
1fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1ff0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
2000: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
2010: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
2020: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2030: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
2040: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
2050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2060: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
2070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
2080: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2090: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
20a0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
20b0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
20c0: 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_NE || pExpr->o
20d0: 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70  p==TK_IS || pExp
20e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
20f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
2100: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61  pr->pLeft );.  a
2110: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
2120: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
2130: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45  pLeft);.  if( pE
2140: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
2150: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
2160: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
2170: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
2180: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
2190: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21a0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
21b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66  lect) ){.    aff
21c0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
21d0: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
21e0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
21f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
2200: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
2210: 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( aff==0 ){.    
2220: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
2230: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
2240: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2250: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
2260: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
2270: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
2280: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
2290: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
22a0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
22b0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
22c0: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
22d0: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
22e0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
22f0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
2300: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2310: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
2320: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
2330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
2340: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
2350: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
2360: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
2370: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
2380: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
2390: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
23a0: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
23b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
23c0: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
23d0: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
23e0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
23f0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
2400: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2410: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
2420: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
2430: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
2440: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
2450: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
2460: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2470: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
2480: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2490: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
24a0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
24b0: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
24c0: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
24d0: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
24e0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
24f0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
2500: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
2510: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
2520: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
2530: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
2540: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
2550: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
2560: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
2570: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2580: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
2590: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
25a0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
25e0: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
25f0: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
2600: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
2610: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
2620: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
2630: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
2640: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
2650: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
2660: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2670: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
2680: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
2690: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
26a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
26b0: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
26c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
26d0: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
26e0: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
26f0: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
2700: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
2710: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
2720: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
2730: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
2740: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
2750: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
2760: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
2770: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
2780: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
2790: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
27a0: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
27b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
27c0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
27d0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
27e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
27f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
2800: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
2810: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
2820: 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  late ){.    pCol
2830: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2850: 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Left);.  }else i
2860: 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52  f( pRight && (pR
2870: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
2880: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
2890: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
28a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
28b0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
28c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
28d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
28f0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
2900: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2910: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2920: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2930: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
2940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2950: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
2960: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2970: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
2980: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
2990: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
29a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
29b0: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
29c0: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
29d0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
29e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
29f0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
2a00: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
2a10: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
2a20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
2a30: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2a40: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
2a50: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
2a60: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
2a70: 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32  int in1, int in2
2a80: 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f  , /* Register ho
2a90: 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a  lding operands *
2aa0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
2ab0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2ac0: 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a  re if true.  */.
2ad0: 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
2ae0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2af0: 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f  jump if either o
2b00: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a  perand is NULL *
2b10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20  /.){.  int p5;. 
2b20: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c   int addr;.  Col
2b30: 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20  lSeq *p4;..  p4 
2b40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
2b50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
2b60: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
2b70: 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e  ght);.  p5 = bin
2b80: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65  aryCompareP5(pLe
2b90: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
2ba0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20  IfNull);.  addr 
2bb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2bc0: 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op4(pParse->pVdb
2bd0: 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20  e, opcode, in2, 
2be0: 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20  dest, in1,.     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c        (void*)p4,
2c10: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
2c20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c30: 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62  eP5(pParse->pVdb
2c40: 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65  e, (u8)p5);.  re
2c50: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2c70: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  if expression pE
2c80: 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c  xpr is a vector,
2c90: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2ca0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63  ise..**.** A vec
2cb0: 74 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61  tor is defined a
2cc0: 73 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  s any expression
2cd0: 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e   that results in
2ce0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
2cf0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c  columns of resul
2d00: 74 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43  t.  Every TK_VEC
2d10: 54 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76  TOR node is an v
2d20: 65 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68  ector because th
2d30: 65 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c  e.** parser will
2d40: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20   not generate a 
2d50: 54 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66  TK_VECTOR with f
2d60: 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e  ewer than two en
2d70: 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20  tries..** But a 
2d80: 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20  TK_SELECT might 
2d90: 62 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74  be either a vect
2da0: 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20  or or a scalar. 
2db0: 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f  It is only.** co
2dc0: 6e 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f  nsidered a vecto
2dd0: 72 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20  r if it has two 
2de0: 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  or more result c
2df0: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  olumns..*/.int s
2e00: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
2e10: 6f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  or(Expr *pExpr){
2e20: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e30: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2e40: 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  pExpr)>1;.}../*.
2e50: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2e60: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
2e70: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2e80: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
2e90: 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e  ECTOR .** return
2ea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2eb0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
2ec0: 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66  e vector. Or, if
2ed0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
2ee0: 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
2ef0: 63 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ct, return the n
2f00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2f10: 20 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65   in the sub-sele
2f20: 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f  ct. For.** any o
2f30: 74 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70  ther type of exp
2f40: 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20  ression, return 
2f50: 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
2f60: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
2f70: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2f80: 75 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  u8 op = pExpr->o
2f90: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
2fa0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
2fb0: 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66  pExpr->op2;.  if
2fc0: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
2fd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45  ){.    return pE
2fe0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2ff0: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xpr;.  }else if(
3000: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
3010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
3020: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
3030: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3040: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3050: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
3060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
3070: 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65  er to a subexpre
3080: 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72  ssion of pVector
3090: 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74   that is the i-t
30a0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  h.** column of t
30b0: 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65  he vector (numbe
30c0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  red starting wit
30d0: 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65  h 0).  The calle
30e0: 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65  r must.** ensure
30f0: 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69   that i is withi
3100: 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  n range..**.** I
3110: 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61  f pVector is rea
3120: 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e  lly a scalar (an
3130: 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20  d "scalar" here 
3140: 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72  includes subquer
3150: 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75  ies.** that retu
3160: 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  rn a single colu
3170: 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e  mn!) then return
3180: 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66   pVector unmodif
3190: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74  ied..**.** pVect
31a0: 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  or retains owner
31b0: 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75  ship of the retu
31c0: 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69  rned subexpressi
31d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
31e0: 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45   vector is a (SE
31f0: 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74  LECT ...) then t
3200: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
3210: 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73  turned is.** jus
3220: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
3230: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65   for the i-th te
3240: 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
3250: 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a   set, and may.**
3260: 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f   not be ready fo
3270: 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63  r evaluation bec
3280: 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63  ause the table c
3290: 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65  ursor has not ye
32a0: 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69  t.** been positi
32b0: 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oned..*/.Expr *s
32c0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
32d0: 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70  dSubexpr(Expr *p
32e0: 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a  Vector, int i){.
32f0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69    assert( i<sqli
3300: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
3310: 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20  e(pVector) );.  
3320: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
3330: 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29  sVector(pVector)
3340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3350: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20  pVector->op2==0 
3360: 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  || pVector->op==
3370: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
3380: 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e     if( pVector->
3390: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c  op==TK_SELECT ||
33a0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54   pVector->op2==T
33b0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
33c0: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
33d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
33e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
33f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3400: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3410: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
3420: 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  pExpr;.    }.  }
3430: 0a 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f  .  return pVecto
3440: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  r;.}../*.** Comp
3450: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
3460: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
3470: 20 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73   which when pass
3480: 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ed to.** sqlite3
3490: 45 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20  ExprCode() will 
34a0: 67 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63  generate all nec
34b0: 65 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63  essary code to c
34c0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46  ompute.** the iF
34d0: 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  ield-th column o
34e0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70  f the vector exp
34f0: 72 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e  ression pVector.
3500: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20  .**.** It is ok 
3510: 66 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62  for pVector to b
3520: 65 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c  e a scalar (as l
3530: 6f 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30  ong as iField==0
3540: 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ).  .** In that 
3550: 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
3560: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ne works like sq
3570: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a  lite3ExprDup()..
3580: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3590: 20 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e   owns the return
35a0: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  ed Expr object a
35b0: 6e 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  nd is responsibl
35c0: 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e  e for.** ensurin
35d0: 67 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  g that the retur
35e0: 6e 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75  ned value eventu
35f0: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
3600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
3610: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3620: 68 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20  hip of pVector. 
3630: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
3640: 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74   TK_SELECT,.** t
3650: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
3660: 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66   object will ref
3670: 65 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61  erence pVector a
3680: 6e 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75  nd so pVector mu
3690: 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c  st remain.** val
36a0: 69 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20  id for the life 
36b0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
36c0: 6f 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63  object.  If pVec
36d0: 74 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54  tor is a TK_VECT
36e0: 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61  OR.** or a scala
36f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  r expression, th
3700: 65 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c  en it can be del
3710: 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  eted as soon as 
3720: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  returns..**.** A
3740: 20 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20   trick to cause 
3750: 61 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63  a TK_SELECT pVec
3760: 74 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65  tor to be delete
3770: 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a  d together with.
3780: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
3790: 45 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74  Expr object is t
37a0: 6f 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65  o attach the pVe
37b0: 63 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67  ctor to the pRig
37c0: 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74  ht field.** of t
37d0: 68 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53  he returned TK_S
37e0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
37f0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70  r object..*/.Exp
3800: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f  r *sqlite3ExprFo
3810: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20  rVectorField(.  
3820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3830: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3850: 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20  r *pVector,     
3860: 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e    /* The vector.
3870: 20 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73    List of expres
3880: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53  sions or a sub-S
3890: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69  ELECT */.  int i
38a0: 46 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20  Field           
38b0: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
38c0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f  of the vector to
38d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20   return */.){.  
38e0: 45 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66  Expr *pRet;.  if
38f0: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3900: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
3910: 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d  assert( pVector-
3920: 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
3930: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20  elect );.    /* 
3940: 54 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  The TK_SELECT_CO
3950: 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a  LUMN Expr node:.
3960: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c      **.    ** pL
3970: 65 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70  eft:           p
3980: 56 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e  Vector containin
3990: 67 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f  g TK_SELECT.  No
39a0: 74 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  t deleted..    *
39b0: 2a 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20  * pRight:       
39c0: 20 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75     not used.  Bu
39d0: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65  t recursively de
39e0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43  leted..    ** iC
39f0: 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49  olumn:         I
3a00: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
3a10: 20 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20   in pVector.    
3a20: 2a 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20  ** iTable:      
3a30: 20 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d      0 or the num
3a40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
3a50: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20  n the LHS of an 
3a60: 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a  assignment.    *
3a70: 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a  * pLeft->iTable:
3a80: 20 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61     First in an a
3a90: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
3aa0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c   holding result,
3ab0: 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20   or 0.    **    
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3ad0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
3ae0: 6f 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e  ot yet computed.
3af0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
3b00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b10: 28 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  () specifically 
3b20: 73 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73  skips the recurs
3b30: 69 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20  ive delete of.  
3b40: 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b    ** pLeft on TK
3b50: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3b60: 6f 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68  odes.  But pRigh
3b70: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73  t is followed, s
3b80: 6f 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a  o pVector.    **
3b90: 20 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64   can be attached
3ba0: 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61   to pRight to ca
3bb0: 75 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f  use this node to
3bc0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
3bd0: 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f  of.    ** pVecto
3be0: 72 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  r.  Typically th
3bf0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74  ere will be mult
3c00: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3c10: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20  OLUMN nodes.    
3c20: 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
3c30: 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74   pLeft pointer t
3c40: 6f 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62  o the pVector, b
3c50: 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  ut only one of t
3c60: 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  hem.    ** will 
3c70: 6f 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e  own the pVector.
3c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74  .    */.    pRet
3c90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
3ca0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
3cb0: 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  T_COLUMN, 0, 0);
3cc0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
3cd0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f  .      pRet->iCo
3ce0: 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20  lumn = iField;. 
3cf0: 20 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74       pRet->pLeft
3d00: 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20   = pVector;.    
3d10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
3d20: 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69  et==0 || pRet->i
3d30: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65  Table==0 );.  }e
3d40: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65  lse{.    if( pVe
3d50: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43  ctor->op==TK_VEC
3d60: 54 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20  TOR ) pVector = 
3d70: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3d80: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3d90: 72 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  r;.    pRet = sq
3da0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3db0: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3dc0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
3dd0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
3de0: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3df0: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3e00: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3e10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3e20: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3e30: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3e40: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3e50: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3e60: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3e70: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3e80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3e90: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ea0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3eb0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3ec0: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3ed0: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3ee0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3ef0: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3f00: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3f10: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3f20: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3f30: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3f40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3f50: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3f60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3f70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3f80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3f90: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3fa0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3fb0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3fc0: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3fd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3fe0: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3ff0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
4000: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
4010: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
4020: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
4030: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
4040: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
4050: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
4060: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
4070: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4080: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
4090: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
40a0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
40b0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
40c0: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
40d0: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
40f0: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
4100: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
4110: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
4120: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
4130: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
4140: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
4150: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4160: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
4170: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
4180: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
4190: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
41a0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
41b0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
41c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
41d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
41e0: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
41f0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
4200: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
4210: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
4220: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
4230: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
4240: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
4250: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
4260: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
4270: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
4280: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
4290: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
42a0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
42b0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
42c0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
42d0: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
42e0: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
42f0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
4300: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
4310: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
4320: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
4330: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
4340: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
4350: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
4360: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
4370: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
43a0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43c0: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
43d0: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
43e0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4410: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4420: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4430: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4450: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
4460: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
4470: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
44a0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
44b0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44d0: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
44e0: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
44f0: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4500: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4510: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4520: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4530: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4540: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4550: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
4560: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
4570: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
4580: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
4590: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
45a0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
45b0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
45c0: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
45d0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
45e0: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
45f0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4600: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4610: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4620: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4630: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4640: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4650: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
4660: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
4670: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
4680: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
4690: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
46a0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
46b0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
46c0: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
46d0: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
46e0: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
46f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4700: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4710: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4720: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4730: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4740: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4750: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
4760: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
4770: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
4780: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
4790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47a0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
47b0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
47c0: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
47d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
47e0: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
47f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4800: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4810: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4820: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4830: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4850: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
4860: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4870: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
4880: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
4890: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
48a0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
48b0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
48c0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
48d0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
48e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
48f0: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4900: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4910: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4920: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4930: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4940: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4950: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
4960: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
4970: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
4980: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4990: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
49a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
49b0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
49c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
49d0: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
49e0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
49f0: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4a00: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4a10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4a20: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4a30: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4a40: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4a50: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4a60: 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  );..  if( nLeft!
4a70: 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  =sqlite3ExprVect
4a80: 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29  orSize(pRight) )
4a90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4aa0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
4ab0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
4ac0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
4ad0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
4ae0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
4af0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b00: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4b10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4b20: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4b30: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4b40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b50: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
4b60: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
4b70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4b80: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
4b90: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
4ba0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4bb0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4bc0: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4bd0: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4be0: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
4bf0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
4c00: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4c10: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4c20: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4c30: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4c40: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4c50: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
4c60: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
4c70: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
4c80: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
4c90: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
4ca0: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
4cb0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
4cc0: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
4cd0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4ce0: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
4cf0: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4d00: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4d10: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4d20: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4d30: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4d50: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
4d60: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
4d70: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
4d80: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
4d90: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
4da0: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
4db0: 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f    r1 = exprVecto
4dc0: 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  rRegister(pParse
4dd0: 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c  , pLeft, i, regL
4de0: 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72  eft, &pL, &regFr
4df0: 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65  ee1);.    r2 = e
4e00: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4e10: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
4e20: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
4e30: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
4e40: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
4e50: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
4e60: 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73  opx, r1, r2, des
4e70: 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74  t, p5);.    test
4e80: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
4e90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ea0: 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
4eb0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4ec0: 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
4ed0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ee0: 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
4ef0: 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
4f00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f10: 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65  ==OP_Gt);.    te
4f20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
4f30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
4f50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f60: 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
4f70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f80: 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Eq);.    testca
4f90: 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
4fa0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4fb0: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
4fc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4fd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4fe0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c  gFree1);.    sql
4ff0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5000: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
5010: 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  ee2);.    if( i=
5020: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
5030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5040: 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45     if( opx==TK_E
5050: 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q ){.      sqlit
5060: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5070: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
5080: 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43  addrDone); VdbeC
5090: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
50a0: 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b    p5 |= SQLITE_K
50b0: 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  EEPNULL;.    }el
50c0: 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e  se if( opx==TK_N
50d0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
50e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
50f0: 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64  OP_If, dest, add
5100: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
5110: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
5120: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5130: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
5140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
5150: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p==TK_LT || op==
5160: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_GT || op==TK_
5170: 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20  LE || op==TK_GE 
5180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51a0: 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61  _ElseNotEq, 0, a
51b0: 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  ddrDone);.      
51c0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
51d0: 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  , op==TK_LT);.  
51e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
51f0: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29  If(v, op==TK_GT)
5200: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5210: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
5220: 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LE);.      Vdbe
5230: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5240: 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20  ==TK_GE);.      
5250: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
5260: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d   opx = op;.    }
5270: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5280: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5290: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a  , addrDone);.}..
52a0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
52b0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
52c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
52d0: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
52e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
52f0: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5300: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
5310: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
5320: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
5330: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5340: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
5350: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5360: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5380: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
5390: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
53a0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
53b0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
53c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
53d0: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
53e0: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
53f0: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
5400: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5410: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
5420: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
5430: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
5440: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
5450: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
5460: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
5470: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5480: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
54a0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
54b0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
54c0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
54d0: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
54e0: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
54f0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
5500: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
5510: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
5520: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5530: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
5540: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5550: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
5560: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
5570: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
5580: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
5590: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
55a0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
55b0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
55c0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
55d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
55e0: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
55f0: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
5600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5610: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
5620: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
5630: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
5650: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
5660: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
5670: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
5680: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5690: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
56a0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
56b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
56c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
56d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
56e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
56f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5700: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5710: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
5720: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
5730: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5740: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
5750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69  lect *pSelect, i
5760: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5770: 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f   Select *p;.  fo
5780: 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20  r(p=pSelect; p; 
5790: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
57a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57b0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
57c0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57d0: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
57e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57f0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5800: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
5810: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5820: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5830: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5840: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5850: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5860: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5870: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5880: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5890: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
58a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
58b0: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
58c0: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
58d0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
58e0: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
58f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
5900: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
5910: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
5920: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
5930: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
5940: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
5950: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
5960: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
5970: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5980: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5990: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
59a0: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
59b0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  one..**.** Also 
59c0: 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f  propagate EP_Pro
59d0: 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20  pagate flags up 
59e0: 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73  from Expr.x.pLis
59f0: 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c  t to Expr.flags,
5a00: 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61  .** if appropria
5a10: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
5a20: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
5a30: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
5a40: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5a50: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5a60: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
5a70: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5a80: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
5a90: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
5aa0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ab0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5ac0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
5ad0: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
5ae0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
5af0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c  else if( p->x.pL
5b00: 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ist ){.    heigh
5b10: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78  tOfExprList(p->x
5b20: 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74  .pList, &nHeight
5b30: 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  );.    p->flags 
5b40: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
5b50: 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
5b60: 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73  tFlags(p->x.pLis
5b70: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
5b80: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5b90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
5ba0: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
5bb0: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
5bc0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
5bd0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
5be0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
5bf0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5c00: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5c10: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
5c20: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
5c30: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
5c40: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5c50: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
5c60: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
5c70: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
5c80: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
5c90: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
5ca0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5cb0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
5cc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5cd0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50  pr *p){.  if( pP
5ce0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
5cf0: 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65  urn;.  exprSetHe
5d00: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
5d10: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
5d20: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
5d30: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
5d40: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
5d50: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5d60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5d70: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
5d80: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
5d90: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
5da0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
5db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
5dc0: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
5dd0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
5de0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5df0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
5e00: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
5e10: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
5e20: 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20  else /* ABOVE:  
5e30: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5e40: 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c  nt enabled.  BEL
5e50: 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72  OW: Height enfor
5e60: 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a  cement off */./*
5e70: 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c  .** Propagate al
5e80: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5e90: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5ea0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5eb0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ed0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5ee0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5ef0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5f00: 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c  if( p && p->x.pL
5f10: 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50  ist && !ExprHasP
5f20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5f30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5f40: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5f50: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5f60: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5f70: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5f80: 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53  .}.#define exprS
5f90: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
5fa0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
5fb0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
5fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5fd0: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
5fe0: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
5ff0: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
6000: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
6010: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
6020: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
6030: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
6040: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
6050: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
6060: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
6070: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
6080: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
6090: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
60a0: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
60b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
60c0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
60d0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
60e0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
60f0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
6100: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
6110: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
6120: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
6130: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
6140: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
6150: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
6160: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
6170: 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68  s performed.  Th
6180: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
6190: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
61a0: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
61b0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
61c0: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
61d0: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
61e0: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
61f0: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
6200: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
6210: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
6220: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
6230: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
6240: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
6250: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
6260: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
6270: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
6280: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
6290: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
62a0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
62b0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
62c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
62d0: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
62e0: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
62f0: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
6300: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
6310: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
6320: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
6330: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
6340: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
6350: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
6360: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
6370: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
6380: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
6390: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
63a0: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
63b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
63c0: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
63d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
63e0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
63f0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
6400: 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20  locRawNN() */.  
6410: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6420: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6430: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
6440: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
6450: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
6460: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6470: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6480: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
64a0: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
64b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
64c0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
64d0: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
64e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
64f0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6500: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
6510: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
6520: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
6530: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
6540: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
6550: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
6560: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6570: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6580: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6590: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
65a0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
65b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
65c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
65d0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
65e0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
65f0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6600: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6610: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
6620: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
6630: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6640: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6650: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
6660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6670: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6680: 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b  ntValue|EP_Leaf;
6690: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66a0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
66d0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
66e0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
66f0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6700: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6710: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6720: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6730: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6740: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6750: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6760: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6770: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
6780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
6790: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67a0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
67d0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
67e0: 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  ]=='"' ) pNew->f
67f0: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
6800: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  oted;.          
6810: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
6820: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
6830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6840: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  }.    }.#if SQLI
6850: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6860: 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48  H>0.    pNew->nH
6870: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
6880: 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f  .  }.  return
6890: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
68a0: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  Allocate a new e
68b0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
68c0: 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  rom a zero-termi
68d0: 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74  nated token that
68e0: 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
68f0: 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a  been dequoted..*
6900: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6910: 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
6920: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
6930: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
6940: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6950: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
6960: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6990: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
69a0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20  ar *zToken      
69b0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
69c0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
69d0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20  L */.){.  Token 
69e0: 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65  x;.  x.z = zToke
69f0: 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74  n;.  x.n = sqlit
6a00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
6a10: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  n);.  return sql
6a20: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6a30: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
6a40: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
6a50: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6a60: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
6a70: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6a80: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6a90: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6aa0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6ab0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6ac0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6ad0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6ae0: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6af0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6b00: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6b10: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
6b20: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
6b30: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
6b40: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
6b50: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
6b60: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
6b70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6b80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6b90: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bb0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6bc0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6bd0: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6be0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6bf0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6c00: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6c10: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
6c20: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
6c30: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
6c40: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6c50: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
6c60: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
6c70: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6c80: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6c90: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6ca0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6cc0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6ce0: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6cf0: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6d00: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6d10: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
6d20: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
6d30: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
6d40: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
6d50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6d60: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
6d70: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6d80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6d90: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6db0: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6dc0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6dd0: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6de0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6df0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6e00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e30: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6e40: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6e50: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6e60: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6e70: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6e80: 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20  *pRight         
6e90: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6ea0: 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  and */.){.  Expr
6eb0: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6ec0: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6ed0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6ee0: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6ef0: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6f00: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6f10: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6f20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6f30: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6f40: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
6f50: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6f60: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
6f70: 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
6f80: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  ->db, sizeof(Exp
6f90: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  r));.    if( p )
6fa0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
6fb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6fc0: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20  ));.      p->op 
6fd0: 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  = op & TKFLG_MAS
6fe0: 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67  K;.      p->iAgg
6ff0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
7000: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7010: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
7020: 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c  e->db, p, pLeft,
7030: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
7040: 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71  if( p ) {.    sq
7050: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
7060: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
7070: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
7080: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7090: 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74  ** Add pSelect t
70a0: 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65  o the Expr.x.pSe
70b0: 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c  lect field.  Or,
70c0: 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c   if pExpr is NUL
70d0: 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d  L (due.** do a m
70e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
70f0: 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64   failure) then d
7100: 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63  elete the pSelec
7110: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
7120: 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64  d sqlite3PExprAd
7130: 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  dSelect(Parse *p
7140: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7150: 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  pr, Select *pSel
7160: 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ect){.  if( pExp
7170: 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r ){.    pExpr->
7180: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7190: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
71a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
71b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f  EP_xIsSelect|EP_
71c0: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73  Subquery);.    s
71d0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
71e0: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
71f0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65  se, pExpr);.  }e
7200: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7210: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
7220: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7230: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
7240: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7250: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d   pSelect);.  }.}
7260: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
7270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
7280: 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55 45  ways either TRUE
7290: 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70 65   or FALSE (respe
72a0: 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65  ctively),.** the
72b0: 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  n return 1.  If 
72c0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72  one cannot deter
72d0: 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20 76  mine the truth v
72e0: 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65  alue of the.** e
72f0: 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d  xpression at com
7300: 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72 6e  pile-time return
7310: 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69   0..**.** This i
7320: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
7330: 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 20  n.  If is OK to 
7340: 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65 76  return 0 here ev
7350: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78 70  en if.** the exp
7360: 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69  ression really i
7370: 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 6f  s always false o
7380: 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73 65  r false (a false
7390: 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42   negative)..** B
73a0: 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20 74  ut it is a bug t
73b0: 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74 68  o return 1 if th
73c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
73d0: 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ht have differen
73e0: 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  t.** boolean val
73f0: 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  ues in different
7400: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28   circumstances (
7410: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
7420: 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  .).**.** Note th
7430: 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  at if the expres
7440: 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  sion is part of 
7450: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20  conditional for 
7460: 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  a.** LEFT JOIN, 
7470: 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64  then we cannot d
7480: 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70  etermine at comp
7490: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
74a0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74   or not.** is it
74b0: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20   true or false, 
74c0: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
74d0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
74e0: 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  t exprAlwaysTrue
74f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
7500: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7510: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7520: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7540: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7550: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7560: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7570: 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63  n v!=0;.}.static
7580: 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46   int exprAlwaysF
7590: 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  alse(Expr *p){. 
75a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
75b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
75c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
75d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
75e0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
75f0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
7600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7610: 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn v==0;.}../
7620: 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78  *.** Join two ex
7630: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
7640: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
7650: 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72    If either expr
7660: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c  ession is.** NUL
7670: 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  L, then just ret
7680: 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78  urn the other ex
7690: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
76a0: 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  If one side or t
76b0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
76c0: 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  AND is known to 
76d0: 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69  be false, then i
76e0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74  nstead.** of ret
76f0: 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78  urning an AND ex
7700: 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72  pression, just r
7710: 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74  eturn a constant
7720: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
7730: 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66  .** a value of f
7740: 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  alse..*/.Expr *s
7750: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71  qlite3ExprAnd(sq
7760: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7770: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
7780: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65  ight){.  if( pLe
7790: 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ft==0 ){.    ret
77a0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  urn pRight;.  }e
77b0: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d  lse if( pRight==
77c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77d0: 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69  pLeft;.  }else i
77e0: 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
77f0: 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70  se(pLeft) || exp
7800: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69  rAlwaysFalse(pRi
7810: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
7820: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7830: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
7840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7850: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  db, pRight);.   
7860: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
7870: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7880: 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
7890: 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30  3IntTokens[0], 0
78a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
78b0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
78c0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
78d0: 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b  , TK_AND, 0, 0);
78e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
78f0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64  AttachSubtrees(d
7900: 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20  b, pNew, pLeft, 
7910: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
7920: 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  urn pNew;.  }.}.
7930: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
7940: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
7950: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
7960: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
7970: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
7980: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
7990: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a  e3ExprFunction(.
79a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
79b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
79c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
79d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
79e0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
79f0: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  t list */.  Toke
7a00: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20  n *pToken,      
7a10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7a20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
7a30: 6e 74 20 65 44 69 73 74 69 6e 63 74 20 20 20 20  nt eDistinct    
7a40: 20 20 20 20 20 2f 2a 20 53 46 5f 44 69 73 74 69       /* SF_Disti
7a50: 6e 63 74 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72  nct or SF_ALL or
7a60: 20 30 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20   0 */.){.  Expr 
7a70: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7a80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
7aa0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
7ab0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7ac0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
7ad0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
7ae0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
7af0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7b00: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7b10: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7b20: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7b30: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7b40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7b50: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
7b60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70  pList->nExpr > p
7b70: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
7b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
7b90: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a  UNCTION_ARG] ){.
7ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7bb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
7bc0: 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20   many arguments 
7bd0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c  on function %T",
7be0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
7bf0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
7c00: 70 4c 69 73 74 3b 0a 20 20 45 78 70 72 53 65 74  pList;.  ExprSet
7c10: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7c20: 50 5f 48 61 73 46 75 6e 63 29 3b 0a 20 20 61 73  P_HasFunc);.  as
7c30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7c40: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
7c50: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
7c60: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
7c70: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7c80: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  rse, pNew);.  if
7c90: 28 20 65 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f  ( eDistinct==SF_
7ca0: 44 69 73 74 69 6e 63 74 20 29 20 45 78 70 72 53  Distinct ) ExprS
7cb0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  etProperty(pNew,
7cc0: 20 45 50 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20   EP_Distinct);. 
7cd0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7ce0: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
7cf0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7d00: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7d10: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
7d20: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
7d30: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7d40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
7d50: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
7d60: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
7d70: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
7d80: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
7d90: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
7da0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
7db0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7dc0: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
7dd0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
7de0: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
7df0: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
7e00: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
7e10: 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20 61 20   big to avoid a 
7e20: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
7e30: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
7e40: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7e50: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
7e60: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
7e70: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7e80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
7e90: 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72  aaa", "@aaa", or
7ea0: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
7eb0: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
7ec0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
7ed0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
7ee0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
7ef0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
7f00: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
7f10: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
7f20: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
7f30: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
7f40: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
7f50: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
7f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f70: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
7f80: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
7f90: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
7fa0: 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65  u32 n){.  sqlite
7fb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7fc0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
7fd0: 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a   *z;.  ynVar x;.
7fe0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8000: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8010: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
8020: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
8030: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
8040: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
8050: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
8060: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
8070: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
8080: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
8090: 75 33 32 29 73 71 6c 69 74 65 33 53 74 72 6c 65  u32)sqlite3Strle
80a0: 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20  n30(z) );.  if( 
80b0: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
80c0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
80d0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
80e0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
8110: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d  =='?' );.    x =
8120: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8130: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73  e->nVar);.  }els
8140: 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64  e{.    int doAdd
8150: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b   = 0;.    if( z[
8160: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
8170: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
8180: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
8190: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
81a0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
81b0: 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69  d.      ** use i
81c0: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
81d0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
81e0: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69    i64 i;.      i
81f0: 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66  nt bOk;.      if
8200: 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49  ( n==2 ){ /*OPTI
8210: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45  MIZATION-IF-TRUE
8220: 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d 20 7a  */.        i = z
8230: 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65  [1]-'0';  /* The
8240: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
8250: 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ?N for a single 
8260: 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20  digit N */.     
8270: 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
8280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8290: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
82a0: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
82b0: 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55  i, n-1, SQLITE_U
82c0: 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
82d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
82e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
82f0: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
8300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
8310: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
8320: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8330: 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20  E_NUMBER]-1 );. 
8340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
8350: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
8360: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8370: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
8380: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
8390: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
83a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
83b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
83c0: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ER] ){.        s
83d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
83e0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
83f0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
8400: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
8410: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
8420: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
8430: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8440: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
8450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8460: 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20 28 79    }.      x = (y
8470: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 69 66  nVar)i;.      if
8480: 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( x>pParse->nVar
8490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
84a0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
84b0: 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  x;.        doAdd
84c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
84d0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 56 4c 69  e if( sqlite3VLi
84e0: 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72  stNumToName(pPar
84f0: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d  se->pVList, x)==
8500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 41  0 ){.        doA
8510: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8530: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
8540: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
8550: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
8560: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8570: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
8580: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
8590: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
85a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
85b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
85c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
85d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
85e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
85f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
8600: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
8610: 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71 6c 69   x = (ynVar)sqli
8620: 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75  te3VListNameToNu
8630: 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  m(pParse->pVList
8640: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  , z, n);.      i
8650: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
8660: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8670: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8680: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8690: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
86a0: 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64 20 29  .    if( doAdd )
86b0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
86c0: 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pVList = sqlite3
86d0: 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70 50 61  VListAdd(db, pPa
86e0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
86f0: 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  n, x);.    }.  }
8700: 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  .  pExpr->iColum
8710: 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78 3e 64  n = x;.  if( x>d
8720: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8730: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8740: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
8750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8770: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
8780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8790: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
87a0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
87b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
87c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
87d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
87e0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
87f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8800: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8810: 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ;.  /* Sanity ch
8820: 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74  eck: Assert that
8830: 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73   the IntValue is
8840: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66   non-negative if
8850: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
8860: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
8880: 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75  ntValue) || p->u
8890: 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20  .iValue>=0 );.. 
88a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
88b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
88c0: 57 69 6e 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79  WinFunc) || p->y
88d0: 2e 70 57 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e  .pWin!=0 || db->
88e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
88f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
8900: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
8910: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8920: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
8930: 45 50 5f 52 65 64 75 63 65 64 29 0a 20 20 20 20  EP_Reduced).    
8940: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57        || p->y.pW
8950: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
8960: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57  Property(p, EP_W
8970: 69 6e 46 75 6e 63 29 20 29 3b 0a 23 69 66 64 65  inFunc) );.#ifde
8980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8990: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
89a0: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
89b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
89c0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
89d0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
89e0: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
89f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8a00: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8a10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8a20: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
8a30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8a40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8a50: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
8a60: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
8a70: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
8a80: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8a90: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8aa0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8ab0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8ac0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8ad0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8ae0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8af0: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
8b00: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8b10: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8b20: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
8b30: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eft);.    if( p-
8b40: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8b50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b60: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67  teNN(db, p->pRig
8b70: 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ht);.    }else i
8b80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b90: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8ba0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
8bb0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
8bc0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
8bd0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8be0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8bf0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8c00: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8c10: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
8c20: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8c30: 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
8c40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
8c50: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
8c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
8c70: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  dowDelete(db, p-
8c80: 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  >y.pWin);.    }.
8c90: 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
8ca0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8cb0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69  MemToken) ) sqli
8cc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8cd0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  >u.zToken);.  if
8ce0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8cf0: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
8d00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8d10: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
8d20: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8d30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8d40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8d50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8d60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8d70: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
8d80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8d90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8da0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8db0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8dc0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8dd0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8de0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8df0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8e00: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8e10: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8e20: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8e30: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8e40: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8e50: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8e60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8e70: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8e80: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8e90: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8ea0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8eb0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8ec0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8ed0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8ee0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8ef0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8f00: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8f10: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8f20: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8f30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8f40: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8f50: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8f60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8f80: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8f90: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8fa0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8fb0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8fc0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8fd0: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8fe0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8ff0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
9000: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
9010: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
9020: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
9030: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
9040: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
9050: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
9060: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
9070: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
9080: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
90d0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
90e0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
90f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9100: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
9110: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
9120: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
9130: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
9140: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9150: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
9160: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
9170: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
9180: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
9190: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
91a0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
91b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
91c0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
91d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
91e0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
91f0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
9200: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
9210: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
9220: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
9230: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
9240: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
9250: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
9260: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9270: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9280: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9290: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
92a0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
92b0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
92c0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
92d0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
92e0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
92f0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
9300: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
9310: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9320: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
9330: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
9340: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
9350: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
9360: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9370: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9380: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9390: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
93a0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
93b0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
93c0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
93d0: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
93e0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
93f0: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
9400: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
9410: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
9420: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
9430: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
9440: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
9450: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
9460: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9470: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9480: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9490: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
94a0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
94b0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
94c0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
94d0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
94e0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
94f0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
9500: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
9510: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
9520: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
9530: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
9540: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9550: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
9560: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9570: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9580: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9590: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
95a0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
95b0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
95c0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
95d0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
95e0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
95f0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
9600: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
9610: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9620: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9630: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9640: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9650: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9660: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9670: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9680: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96a0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
96b0: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
96c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
96d0: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
96e0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
96f0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
9700: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9710: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9720: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
9730: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
9740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9750: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9760: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9770: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9790: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
97a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
97b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
97c0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
97d0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
97e0: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
97f0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9800: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
9810: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
9820: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9840: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9850: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
9860: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9870: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9890: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
98a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
98b0: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
98c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98d0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
98e0: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
98f0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
9900: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9910: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
9920: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
9930: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
9940: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9950: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
9960: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9970: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9980: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9990: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
99a0: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
99b0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
99c0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
99d0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
99e0: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
99f0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9a00: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
9a10: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9a20: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9a50: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9a60: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9a70: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9a80: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9a90: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9aa0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9ab0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9ac0: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9ad0: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9ae0: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9af0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9b00: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
9b10: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9b20: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9b30: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9b40: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9b50: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
9b60: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9b70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9b80: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9b90: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9ba0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9bb0: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9bc0: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9bd0: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9be0: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9bf0: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9c00: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
9c10: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9c20: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9c30: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9c40: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9c50: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
9c60: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9c70: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9c80: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9c90: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9ca0: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9cb0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9cc0: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9cd0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9ce0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9cf0: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9d00: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9d10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9d20: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9d30: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9d40: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9d50: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9d60: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9d80: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9d90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9da0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9db0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9dc0: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9dd0: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9de0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9df0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9e00: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9e10: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9e20: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9e30: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9e40: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9e50: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9e60: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9e70: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9e80: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9e90: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9ea0: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9eb0: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9ec0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9ed0: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9ee0: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9ef0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9f00: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9f10: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9f20: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9f30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9f40: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9f50: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9f60: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9f70: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9f80: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9fa0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9fb0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9fd0: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9fe0: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9ff0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
a000: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
a010: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
a020: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
a030: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
a040: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
a050: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
a060: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
a070: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
a080: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a090: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
a0a0: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
a0b0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
a0c0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
a0d0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
a0e0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
a0f0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
a100: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
a110: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a120: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
a130: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
a140: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
a150: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
a160: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
a170: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
a180: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
a190: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
a1a0: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
a1b0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
a1c0: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
a1d0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
a1e0: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
a1f0: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
a200: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
a210: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
a220: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
a230: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
a240: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
a250: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
a260: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a270: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a280: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a290: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a2a0: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a2b0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a2c0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a2d0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a2e0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a2f0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a300: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a310: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a320: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a330: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a340: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a350: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a360: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a370: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a380: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a390: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a3a0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a3b0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a3c0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a3d0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a3f0: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a400: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a410: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a420: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a430: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a440: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a450: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a460: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a480: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a490: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a4a0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a4b0: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a4c0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a4d0: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a4e0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a4f0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a500: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a510: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a520: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a530: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a540: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a550: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a560: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a570: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a580: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a590: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a5a0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a5b0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a5c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a5d0: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a5e0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a5f0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a600: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a610: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a620: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a630: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a640: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a650: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a660: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a670: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a680: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a690: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a6a0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a6b0: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a6c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a6d0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a6e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a6f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a700: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a710: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a720: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a730: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a740: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a750: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a760: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a770: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a780: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a790: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a7a0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a7b0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a7c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a7d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a7e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a7f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a800: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a810: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a820: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a830: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a840: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a850: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a860: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a870: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a880: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a890: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a8a0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a8b0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a8c0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a8d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a8e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a8f0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a900: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a910: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a920: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a930: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a940: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a960: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a970: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a980: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a9b0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a9c0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a9d0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a9e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a9f0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
aa00: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
aa10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
aa20: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
aa30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
aa40: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
aa50: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
aa60: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
aa70: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
aa80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
aa90: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
aaa0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
aab0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
aac0: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
aad0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
aaf0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
ab00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ab10: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
ab20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ab30: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
ab40: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
ab50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
ab60: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
ab80: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
ab90: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
aba0: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
abb0: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
abc0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
abd0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
abe0: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
abf0: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
ac00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ac10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ac20: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
ac30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac40: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
ac50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
ac60: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
ac70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ac80: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aca0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
acb0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
acc0: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
acd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
ace0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
acf0: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
ad00: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
ad10: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
ad20: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
ad30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
ad40: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
ad50: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
ad60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ad70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ad80: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ad90: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ada0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
adb0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
adc0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
add0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
ade0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
adf0: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
ae00: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
ae10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ae20: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ae30: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ae40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ae50: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
ae60: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
ae70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
ae80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
ae90: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
aea0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
aeb0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
aec0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
aed0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
aee0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
aef0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
af00: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
af10: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
af20: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
af30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
af40: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
af50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
af70: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
af80: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
af90: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
afa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
afb0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
afc0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
afd0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
afe0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
aff0: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
b000: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b010: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
b020: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
b030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
b040: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
b050: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
b060: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
b070: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
b080: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
b090: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
b0a0: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
b0b0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
b0c0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
b0d0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
b0e0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b0f0: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
b100: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b110: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b120: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b130: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 45  K_FUNCTION && pE
b140: 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 29  xpr->y.pWin!=0 )
b150: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78  {.    assert( Ex
b160: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
b170: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
b180: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79   );.    pExpr->y
b190: 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 20  .pWin->pNextWin 
b1a0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
b1b0: 6c 65 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20 20  lect->pWin;.    
b1c0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65  pWalker->u.pSele
b1d0: 63 74 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70 72  ct->pWin = pExpr
b1e0: 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20 20  ->y.pWin;.  }.  
b1f0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
b200: 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
b210: 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69  t gatherSelectWi
b220: 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62  ndowsSelectCallb
b230: 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ack(Walker *pWal
b240: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
b250: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61  .  return p==pWa
b260: 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20  lker->u.pSelect 
b270: 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a  ? WRC_Continue :
b280: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74   WRC_Prune;.}.st
b290: 61 74 69 63 20 76 6f 69 64 20 67 61 74 68 65 72  atic void gather
b2a0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65  SelectWindows(Se
b2b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  lect *p){.  Walk
b2c0: 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
b2d0: 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72  allback = gather
b2e0: 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c  SelectWindowsCal
b2f0: 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65  lback;.  w.xSele
b300: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74  ctCallback = gat
b310: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b320: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a  SelectCallback;.
b330: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
b340: 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  ack2 = 0;.  w.u.
b350: 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73  pSelect = p;.  s
b360: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
b370: 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69  (&w, p);.}.#endi
b380: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  f.../*.** The fo
b390: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
b3a0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
b3b0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
b3c0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
b3d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
b3e0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
b3f0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
b400: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
b410: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
b420: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
b430: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
b440: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
b450: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
b460: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
b470: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
b480: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
b490: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
b4a0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
b4b0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
b4c0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
b4d0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b4e0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
b4f0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
b500: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
b510: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b520: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b530: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b540: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b550: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b560: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b570: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b580: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b590: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b5a0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b5b0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b5c0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b5d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b5e0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b5f0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b600: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b610: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b620: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b630: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b640: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b650: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b660: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b670: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b680: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b690: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b6a0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b6b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b6c0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b6d0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b6e0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b6f0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b700: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b710: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b720: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b730: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b740: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b750: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b760: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b770: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b780: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b790: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b7a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b7b0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b7c0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b7d0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b7e0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b7f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b800: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b810: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b820: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b830: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b840: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b850: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b870: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b880: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b890: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b8a0: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b8c0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b8d0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b8e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b8f0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b900: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b910: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b920: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b930: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b940: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b950: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b960: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b970: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b980: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b990: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b9a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b9b0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b9c0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b9d0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b9e0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b9f0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
ba00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
ba10: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
ba20: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
ba30: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
ba40: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
ba50: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
ba60: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
ba70: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ba80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ba90: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
baa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bab0: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
bac0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
bad0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
bae0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
baf0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
bb00: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
bb10: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
bb20: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
bb30: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
bb40: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
bb50: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
bb60: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
bb70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
bb80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bb90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bba0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bbb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
bbc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
bbd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bbe0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
bbf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
bc00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
bc10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
bc20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
bc30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
bc40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
bc50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
bc60: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
bc70: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
bc80: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
bc90: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
bca0: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
bcb0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
bcc0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
bcd0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
bce0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
bcf0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
bd00: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
bd10: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
bd20: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bd30: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
bd40: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
bd50: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
bd60: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
bd70: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
bd80: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
bd90: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
bda0: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
bdb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bdc0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
bdd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bde0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
bdf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
be00: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
be10: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
be20: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
be30: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
be40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
be50: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
be60: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
be70: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
be80: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
be90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bea0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
beb0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
bec0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
bed0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
bee0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
bef0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bf00: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
bf10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bf20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bf30: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
bf40: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
bf50: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
bf60: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
bf70: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
bf80: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bf90: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
bfa0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
bfb0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bfc0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bfd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bfe0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bff0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
c000: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
c010: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
c020: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c030: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c040: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
c050: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c060: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c070: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c080: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c090: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
c0a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c0b0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c0c0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
c0d0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
c0e0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
c0f0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
c100: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
c110: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
c120: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
c130: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
c140: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
c150: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
c160: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
c170: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
c180: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
c190: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
c1a0: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
c1b0: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
c1c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1d0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
c1e0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
c1f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
c200: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
c210: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
c220: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
c230: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
c240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
c250: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
c260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c270: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
c280: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
c290: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
c2a0: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
c2b0: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
c2c0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
c2d0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
c2e0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
c2f0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
c300: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
c310: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c320: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c330: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
c340: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c350: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
c360: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
c370: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
c380: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c390: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
c3a0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
c3b0: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
c3c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
c3d0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
c3e0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
c3f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c400: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
c410: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
c420: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
c430: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
c440: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
c450: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c460: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c470: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
c480: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c490: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
c4a0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
c4b0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
c4c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
c4d0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
c4e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c4f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
c500: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
c510: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c520: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c530: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c540: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c550: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c560: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c570: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c580: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c590: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c5a0: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c5b0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c5c0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c5d0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c5e0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c5f0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c600: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c610: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c620: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c630: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c640: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c650: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c660: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c670: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c680: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c690: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c6a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c6b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c6c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c6d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c6e0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c6f0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c700: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c720: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c730: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c740: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c750: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c760: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c770: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c780: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c790: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c7a0: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c7b0: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c7c0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c7d0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c7e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c7f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c800: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c810: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c820: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c830: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c840: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c850: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c860: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c870: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c880: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c890: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c8a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c8b0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c8c0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c8d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c8e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c8f0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c900: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c910: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c920: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c930: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c940: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c950: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c960: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c970: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c980: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c990: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c9a0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c9b0: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c9c0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c9d0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c9e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c9f0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
ca00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
ca10: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
ca20: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
ca30: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
ca40: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
ca50: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
ca60: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
ca70: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ca80: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
ca90: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
caa0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
cab0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
cac0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
cad0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
cae0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
caf0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
cb00: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
cb10: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
cb20: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
cb30: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
cb40: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
cb50: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
cb60: 66 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  fn);.    if( p->
cb70: 70 57 69 6e 20 29 20 67 61 74 68 65 72 53 65 6c  pWin ) gatherSel
cb80: 65 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29  ectWindows(pNew)
cb90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  ;.#endif.    pNe
cba0: 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65  w->selId = p->se
cbb0: 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  lId;.    *pp = p
cbc0: 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70  New;.    pp = &p
cbd0: 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  New->pPrior;.   
cbe0: 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20   pNext = pNew;. 
cbf0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
cc00: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  t;.}.#else.Selec
cc10: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
cc20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
cc30: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
cc40: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
cc50: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
cc60: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
cc70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
cc80: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
cc90: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
cca0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
ccb0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
ccc0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
ccd0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
cce0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
ccf0: 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72  .** The pList ar
cd00: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  gument must be e
cd10: 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
cd20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78  pointer to an Ex
cd30: 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e  prList.** obtain
cd40: 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  ed from a prior 
cd50: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
cd60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  xprListAppend().
cd70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
cd80: 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  * may not be use
cd90: 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69  d with an ExprLi
cda0: 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  st obtained from
cdb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cdc0: 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e  Dup()..** Reason
cdd0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
cde0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
cdf0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
ce00: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a   in pList->a[].*
ce10: 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  * is a power of 
ce20: 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72  two.  That is tr
ce30: 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78  ue for sqlite3Ex
ce40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  prListAppend() r
ce50: 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73  eturns.** but is
ce60: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
ce70: 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72   true from the r
ce80: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
ce90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cea0: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  p()..**.** If a 
ceb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
cec0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
ced0: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
cee0: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
cef0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
cf00: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
cf10: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
cf20: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
cf30: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
cf40: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
cf50: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
cf60: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
cf70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cf80: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
cf90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
cfa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cfb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
cfc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cfd0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
cfe0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
cff0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
d000: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
d010: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d020: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
d030: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
d040: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ULL */.){.  stru
d050: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d060: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
d070: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d080: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
d090: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
d0a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
d0b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
d0c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
d0d0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
d0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
d100: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
d110: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
d120: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
d130: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
d140: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
d150: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  1))==0 ){.    Ex
d160: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
d170: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
d180: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
d190: 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
d1a0: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
d1b0: 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  )+(2*pList->nExp
d1c0: 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c  r - 1)*sizeof(pL
d1d0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
d1e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
d1f0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
d200: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
d210: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
d220: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d230: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
d240: 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  +];.  assert( of
d250: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d260: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d  prList_item,zNam
d270: 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d  e)==sizeof(pItem
d280: 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73  ->pExpr) );.  as
d290: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d2a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d2b0: 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b  tem,pExpr)==0 );
d2c0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d  .  memset(&pItem
d2d0: 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66  ->zName,0,sizeof
d2e0: 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f  (*pItem)-offseto
d2f0: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d300: 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a  t_item,zName));.
d310: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
d320: 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e   pExpr;.  return
d330: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
d340: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
d350: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
d360: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
d370: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
d380: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d390: 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74   pExpr);.  sqlit
d3a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d3b0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  (db, pList);.  r
d3c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d3d0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70  * pColumns and p
d3e0: 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74  Expr form a vect
d3f0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68  or assignment wh
d400: 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 74  ich is part of t
d410: 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65  he SET.** clause
d420: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
d430: 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74  atement.  Like t
d440: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
d450: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70    (a,b,c) = (exp
d460: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
d470: 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63  ** Or:    (a,b,c
d480: 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c  ) = (SELECT x,y,
d490: 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a  z FROM ....).**.
d4a0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  ** For each term
d4b0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 61   of the vector a
d4c0: 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e  ssignment, appen
d4d0: 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f  d new entries to
d4e0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
d4f0: 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20  on list pList.  
d500: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  In the case of a
d510: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d520: 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20   RHS, append.** 
d530: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
d540: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f   expressions..*/
d550: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
d560: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d570: 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20  Vector(.  Parse 
d580: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d590: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d5a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d5b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
d5c0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d5d0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
d5e0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49  t be NULL */.  I
d5f0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
d600: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
d610: 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66   names of LHS of
d620: 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20   the assignment 
d630: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
d640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d650: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
d660: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
d670: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
d680: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d690: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d6a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
d6b0: 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  i;.  int iFirst 
d6c0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
d6d0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a  >nExpr : 0;.  /*
d6e0: 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e   pColumns can on
d6f0: 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74  ly be NULL due t
d700: 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20  o an OOM but an 
d710: 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61  OOM will cause a
d720: 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f  n.  ** exit prio
d730: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
d740: 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  e being invoked 
d750: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
d760: 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f  Columns==0) ) go
d770: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d780: 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45  _error;.  if( pE
d790: 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65  xpr==0 ) goto ve
d7a0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d7b0: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  r;..  /* If the 
d7c0: 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c  RHS is a vector,
d7d0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d   then we can imm
d7e0: 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74  ediately check t
d7f0: 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a  o see that .  **
d800: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d810: 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74   RHS and LHS mat
d820: 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  ch.  But if the 
d830: 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c  RHS is a SELECT,
d840: 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73   .  ** wildcards
d850: 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65   ("*") in the re
d860: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d870: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65  SELECT must be e
d880: 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20  xpanded before. 
d890: 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68   ** we can do th
d8a0: 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f  e size check, so
d8b0: 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65 20   defer the size 
d8c0: 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65  check until code
d8d0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a   generation..  *
d8e0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
d8f0: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p!=TK_SELECT && 
d900: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28  pColumns->nId!=(
d910: 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  n=sqlite3ExprVec
d920: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29 20  torSize(pExpr)) 
d930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d940: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d950: 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
d960: 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49      pColumns->nI
d990: 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  d, n);.    goto 
d9a0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d9b0: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ror;.  }..  for(
d9c0: 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d  i=0; i<pColumns-
d9d0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
d9e0: 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d  Expr *pSubExpr =
d9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
da00: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
da10: 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20  e, pExpr, i);.  
da20: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
da30: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
da40: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
da50: 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66  SubExpr);.    if
da60: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
da70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
da80: 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b  nExpr==iFirst+i+
da90: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
daa0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
dab0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c  -1].zName = pCol
dac0: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
dad0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73  ;.      pColumns
dae0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30  ->a[i].zName = 0
daf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
db00: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
db10: 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f  iled && pExpr->o
db20: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
db30: 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29  ALWAYS(pList!=0)
db40: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46   ){.    Expr *pF
db50: 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  irst = pList->a[
db60: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20  iFirst].pExpr;. 
db70: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
db80: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
db90: 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d  rt( pFirst->op==
dba0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
dbb0: 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a   );.     .    /*
dbc0: 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43   Store the SELEC
dbd0: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70  T statement in p
dbe0: 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c  Right so it will
dbf0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
dc00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
dc10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20  xprListDelete() 
dc20: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  is called */.   
dc30: 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20   pFirst->pRight 
dc40: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78  = pExpr;.    pEx
dc50: 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  pr = 0;..    /* 
dc60: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a  Remember the siz
dc70: 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
dc80: 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77  iTable so that w
dc90: 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74  e can check that
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20  .    ** the RHS 
dcb0: 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61  and LHS sizes ma
dcc0: 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20  tch during code 
dcd0: 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  generation. */. 
dce0: 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c     pFirst->iTabl
dcf0: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49  e = pColumns->nI
dd00: 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61  d;.  }..vector_a
dd10: 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73  ppend_error:.  s
dd20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
dd30: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
dd40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
dd50: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  te(db, pColumns)
dd60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
dd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dd80: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
dd90: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
dda0: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
ddb0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
ddc0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
ddd0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
dde0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
ddf0: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
de00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
de10: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
de20: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
de30: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
de40: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
de50: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
de60: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
de70: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
de80: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
de90: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
dea0: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
deb0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
dec0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
ded0: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
dee0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
def0: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
df00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
df10: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
df20: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
df30: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
df40: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
df50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
df60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
df70: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
df80: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
df90: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
dfa0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
dfb0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
dfc0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
dfd0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
dfe0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
dff0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e000: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e010: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e020: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
e030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e040: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e060: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e070: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e080: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e090: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
e0a0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
e0b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
e0c0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
e0d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
e0e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e0f0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
e100: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
e110: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
e120: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
e130: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e140: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
e150: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
e160: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e170: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
e180: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e190: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
e1a0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e1b0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e1c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
e1d0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
e1e0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
e1f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
e200: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
e210: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
e220: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
e230: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
e240: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
e250: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
e260: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
e270: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
e280: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
e290: 2c 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e  , (void*)pItem->
e2a0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
e2b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e2c0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e2d0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
e2e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e2f0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e300: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e310: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e320: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e330: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e340: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e350: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
e360: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e370: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e380: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e390: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e3a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e3b0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e3c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e3d0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
e3e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e3f0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e400: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e410: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e420: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e430: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e440: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e460: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
e470: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
e480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e490: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
e4a0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
e4b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e4c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e4e0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
e4f0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
e500: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e510: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e520: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e530: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e540: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
e550: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
e560: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
e570: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e580: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
e590: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
e5a0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e5b0: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e5c0: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e5d0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e5e0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e5f0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e600: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e610: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e620: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e630: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e650: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e670: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e680: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e690: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e6a0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e6b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e6c0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e6d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e6e0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e6f0: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e700: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e710: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e720: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e730: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e740: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e770: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e780: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e790: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e7a0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e7b0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e7c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e7d0: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e7e0: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e7f0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e800: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e810: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e820: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e830: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e840: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e850: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e860: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e880: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e890: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e8a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e8b0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e8c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e8d0: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e8e0: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e8f0: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e910: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e930: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e940: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e950: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e960: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e970: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e980: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e990: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e9a0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e9b0: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e9c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e9d0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e9e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
e9f0: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
ea00: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
ea10: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
ea20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
ea30: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
ea40: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
ea50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
ea60: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
ea70: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
ea80: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ea90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
eaa0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
eab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
eac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
ead0: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
eae0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
eaf0: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
eb00: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
eb10: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
eb20: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
eb30: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
eb40: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
eb50: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
eb60: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
eb70: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
eb80: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
eb90: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
eba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
ebb0: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
ebc0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
ebd0: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
ebe0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ebf0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
ec00: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ec10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
ec20: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
ec30: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
ec40: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
ec50: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
ec60: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
ec70: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
ec80: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
ec90: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
eca0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ecb0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
ecc0: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
ecd0: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
ece0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
ecf0: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
ed00: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
ed10: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
ed20: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
ed30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
ed40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
ed50: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
ed60: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ed70: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
ed80: 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  , "true")==0.   
ed90: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
eda0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
edb0: 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20  n, "false")==0. 
edc0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
edd0: 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  p = TK_TRUEFALSE
ede0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
edf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ee00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
ee10: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
ee20: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70  TK_TRUEFALSE Exp
ee30: 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  r node.  Return 
ee40: 31 20 69 66 20 69 74 20 69 73 20 54 52 55 45 0a  1 if it is TRUE.
ee50: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
ee60: 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20  s FALSE..*/.int 
ee70: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
ee80: 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72  Value(const Expr
ee90: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
eea0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
eeb0: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20  K_TRUEFALSE );. 
eec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eed0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
eee0: 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d  .zToken,"true")=
eef0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
ef00: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
ef10: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c  r->u.zToken,"fal
ef20: 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  se")==0 );.  ret
ef30: 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  urn pExpr->u.zTo
ef40: 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  ken[4]==0;.}.../
ef50: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
ef60: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
ef70: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
ef80: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
ef90: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
efa0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
efb0: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
efc0: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
efd0: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
efe0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
eff0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
f000: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
f010: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
f020: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
f030: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
f040: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
f050: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
f060: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
f070: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f080: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f0a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
f0b0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f0c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
f0d0: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
f0e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f0f0: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
f100: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
f110: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f120: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f130: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
f140: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f150: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
f160: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f170: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
f180: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
f190: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
f1a0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
f1b0: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
f1c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
f1d0: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
f1e0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
f1f0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
f200: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f210: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
f220: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
f230: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
f240: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
f250: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
f260: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
f270: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
f280: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
f290: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
f2a0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
f2b0: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
f2c0: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
f2d0: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
f2e0: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
f2f0: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
f300: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
f310: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
f320: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
f330: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
f340: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
f350: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
f360: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
f370: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
f380: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
f390: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
f3a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
f3b0: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
f3c0: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
f3d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
f3e0: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
f3f0: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
f400: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
f410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
f420: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
f430: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
f440: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
f450: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
f460: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
f470: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
f480: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
f490: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
f4a0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
f4b0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
f4c0: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
f4d0: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
f4e0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
f4f0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
f500: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
f510: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f520: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
f530: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
f540: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
f550: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f560: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
f570: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
f580: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
f590: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
f5a0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
f5b0: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
f5c0: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
f5d0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
f5e0: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
f5f0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
f600: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
f610: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
f620: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
f630: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
f640: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
f650: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
f660: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f670: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
f680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f690: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
f6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f6b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f6c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f6d0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f6e0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f6f0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f700: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f710: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
f720: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74     /* Convert "t
f730: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20  rue" or "false" 
f740: 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  in a DEFAULT cla
f750: 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  use into the.   
f760: 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74     ** appropriat
f770: 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f  e TK_TRUEFALSE o
f780: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f790: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f7a0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
f7b0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f7c0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
f7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7e0: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
f7f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f800: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
f810: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
f820: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f830: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
f840: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f850: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
f860: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f870: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f880: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f890: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f8a0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
f8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f8c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f8d0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f8e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f8f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f900: 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61  FixedCol) && pWa
f910: 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29  lker->eCode!=2 )
f920: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f930: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f950: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f960: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f970: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f980: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f990: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f9a0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f9b0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f9c0: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f9d0: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f9e0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f9f0: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
fa00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fa10: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
fa20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fa30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
fa40: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
fa50: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
fa60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
fa70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
fa80: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
fa90: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
faa0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
fab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
fac0: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
fad0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
fae0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
faf0: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
fb00: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
fb10: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
fb20: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
fb30: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fb40: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
fb50: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
fb60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fb70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
fb80: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
fb90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fba0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
fbb0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
fbc0: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
fbd0: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
fbe0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
fbf0: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
fc00: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
fc10: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
fc20: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
fc30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
fc40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
fc50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
fc60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fc70: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
fc80: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
fc90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fca0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
fcb0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
fcc0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fcd0: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fce0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fcf0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fd00: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
fd10: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
fd20: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
fd30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
fd40: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
fd50: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
fd60: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
fd70: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
fd80: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
fd90: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
fda0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
fdb0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
fdc0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
fdd0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
fde0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
fdf0: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
fe00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fe10: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
fe20: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
fe30: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
fe40: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
fe50: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
fe60: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fe70: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fe80: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fe90: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fea0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
feb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fec0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fed0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fee0: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
fef0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ff00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ff10: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
ff20: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
ff30: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
ff40: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
ff50: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
ff60: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
ff70: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
ff80: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
ff90: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
ffa0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
ffb0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
ffc0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ffd0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
ffe0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fff0: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
10000 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
10010 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
10020 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
10030 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20  **.**   (1) the 
10040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10050 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20  nstant, and.**  
10060 20 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73   (2) the express
10070 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61  ion does origina
10080 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  te in the ON or 
10090 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
100a0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
100b0 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  JOIN, and.**   (
100c0 33 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  3) the expressio
100d0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
100e0 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43  in any EP_FixedC
100f0 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  ol TK_COLUMN.** 
10100 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63        operands c
10110 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
10120 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
10130 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
10140 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
10150 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10160 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61   true, it indica
10170 74 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70  tes that the exp
10180 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ression.** can b
10190 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
101a0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
101b0 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75  r list and evalu
101c0 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a  ated once when.*
101d0 2a 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  * the prepared s
101e0 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20  tatement starts 
101f0 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  up.  See sqlite3
10200 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29  ExprCodeAtInit()
10210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10220 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
10230 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
10240 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
10250 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
10260 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10270 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10280 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10290 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
102a0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
102b0 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
102c0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
102d0 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
102e0 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
102f0 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
10300 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
10310 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
10320 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
10330 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
10340 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
10350 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
10360 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
10370 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
10380 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
10390 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
103a0 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
103b0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
103c0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
103d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
103e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
103f0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
10400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10410 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10420 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
10430 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
10440 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
10450 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
10460 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
10470 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
10480 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
10490 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
104a0 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
104b0 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
104c0 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
104d0 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
104e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
104f0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
10500 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
10510 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
10520 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
10530 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10540 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
10550 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
10560 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
10570 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
10580 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
10590 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
105a0 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  ( sqlite3IsBinar
105b0 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  y(pColl) ){.    
105c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
105d0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
105e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
105f0 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10600 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
10610 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
10620 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
10630 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10640 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
10650 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
10660 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
10670 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
10680 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
10690 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
106a0 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
106b0 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
106c0 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
106d0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
106e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
106f0 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
10700 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
10710 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10720 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
10730 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
10740 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
10750 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
10760 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
10770 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
10780 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
10790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
107a0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
107b0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
107c0 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
107d0 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
107e0 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
107f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10800 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
10810 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
10820 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
10830 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
10840 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
10850 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
10860 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
10870 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
10880 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
10890 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
108a0 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
108b0 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
108c0 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
108d0 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
108e0 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
108f0 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
10900 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
10910 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
10920 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
10930 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
10940 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
10950 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
10960 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
10970 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
10980 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
10990 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
109a0 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
109b0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
109c0 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
109d0 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
109e0 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
109f0 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
10a00 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10a10 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10a20 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
10a30 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
10a40 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
10a50 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
10a60 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
10a70 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
10a80 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
10a90 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
10aa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10ab0 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10ac0 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10ad0 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10ae0 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
10af0 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
10b00 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10b10 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10b20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10b30 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
10b40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10b50 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
10b60 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
10b70 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
10b80 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
10b90 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
10ba0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10bb0 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10bc0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10bd0 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10be0 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
10bf0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
10c00 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10c10 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10c20 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
10c30 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10c40 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10c50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10c60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10c70 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
10c80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
10c90 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
10ca0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10cb0 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10cc0 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10cd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10ce0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10d00 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10d10 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10d20 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10d30 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10d40 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
10d50 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
10d60 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
10d70 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
10d80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10d90 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
10da0 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10db0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10dc0 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10dd0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10de0 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
10df0 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
10e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e10 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
10e20 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10e30 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10e40 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
10e50 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
10e60 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
10e70 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
10e80 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
10e90 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
10ea0 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10eb0 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10ec0 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10ed0 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10ee0 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
10ef0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10f00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
10f10 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
10f20 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
10f30 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10f40 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
10f50 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
10f60 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
10f70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
10f80 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
10f90 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
10fa0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10fb0 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10fc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10fd0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10fe0 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
10ff0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
11000 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
11010 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
11020 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
11030 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
11040 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
11050 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
11060 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
11070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
11080 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
11090 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
110a0 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
110b0 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
110c0 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
110d0 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
110e0 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
110f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11100 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
11110 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
11120 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
11130 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
11140 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
11150 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
11160 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
11170 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
11180 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
11190 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
111a0 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
111b0 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
111c0 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
111d0 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
111e0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
111f0 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
11200 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
11210 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
11220 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
11230 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
11240 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
11250 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
11260 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
11270 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
11280 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
11290 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
112a0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
112b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
112c0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
112d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
112e0 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
112f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11300 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
11310 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
11320 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11330 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
11340 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
11350 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11360 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
11370 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
11380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
11390 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
113a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
113b0 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
113c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
113d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
113e0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
113f0 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
11400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11410 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
11420 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11430 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
11440 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
11450 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
11460 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11470 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
11480 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11490 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
114a0 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
114b0 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
114c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
114d0 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
114e0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
114f0 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
11500 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
11510 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
11520 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
11530 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
11540 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
11550 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
11560 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
11570 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
11580 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
11590 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
115a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
115b0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
115c0 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
115d0 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
115e0 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
115f0 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
11600 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
11610 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
11620 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
11630 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
11640 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
11650 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
11660 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
11670 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
11680 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11690 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
116a0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
116b0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
116c0 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
116d0 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
116e0 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
116f0 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11700 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11710 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11720 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11730 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11740 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
11750 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
11760 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
11770 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
11780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
11790 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
117a0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
117b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
117c0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
117e0 79 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  y.pTab==0 ||  /*
117f0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
11800 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
11810 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11820 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
11830 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
11840 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  >y.pTab->aCol[p-
11850 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
11860 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
11870 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11880 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
11890 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
118a0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
118b0 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
118c0 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
118d0 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
118e0 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
118f0 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
11900 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
11910 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
11920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11930 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
11940 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11950 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
11960 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
11970 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
11980 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
11990 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
119a0 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
119b0 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
119c0 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
119d0 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
119e0 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
119f0 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
11a00 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
11a10 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
11a20 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
11a30 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
11a40 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
11a50 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
11a60 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
11a70 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
11a80 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
11a90 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
11aa0 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
11ab0 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11ac0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11ad0 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
11ae0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11af0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11b00 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11b10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11b20 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
11b30 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11b40 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11b50 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
11b60 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11b70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
11b80 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11b90 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
11ba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
11bb0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
11bc0 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
11bd0 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
11be0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
11bf0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
11c00 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
11c10 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
11c20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11c30 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
11c40 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
11c50 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
11c60 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
11c70 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
11c80 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
11c90 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
11ca0 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
11cb0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11cc0 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
11cd0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11cf0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11d00 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11d10 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
11d20 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
11d30 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
11d40 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
11d50 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
11d60 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
11d70 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
11d80 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
11d90 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11da0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
11db0 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
11dc0 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
11dd0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
11de0 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
11e00 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65  ./*.** pX is the
11e10 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
11e20 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69  erator.  If pX i
11e30 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
11e40 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61  ment .** that ca
11e50 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20  n be simplified 
11e60 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  to a direct tabl
11e70 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72  e access, then r
11e80 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
11e90 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
11ea0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
11eb0 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45  pX is not a SELE
11ec0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
11ed0 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43   or if the SELEC
11ee0 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64  T statement need
11ef0 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74  s to be manifest
11f00 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69  ed into a transi
11f10 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68  ent.** table, th
11f20 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
11f30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11f50 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69  static Select *i
11f60 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
11f70 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20  pt(Expr *pX){.  
11f80 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63  Select *p;.  Src
11f90 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
11fa0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
11fb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11fc0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45   int i;.  if( !E
11fd0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11fe0 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
11ff0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
12000 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   Not a subquery 
12010 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
12020 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
12030 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65  VarSelect)  ) re
12040 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
12050 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
12060 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65   p = pX->x.pSele
12070 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  ct;.  if( p->pPr
12080 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120a0 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
120b0 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
120c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
120d0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
120e0 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
120f0 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
12100 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
12110 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
12120 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
12130 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12140 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12150 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
12160 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
12170 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
12180 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
12190 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
121a0 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
121b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
121c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
121d0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121f0 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
12200 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12210 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
12220 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12230 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
12240 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
12250 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
12260 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12270 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
12280 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12290 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
122a0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
122b0 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
122c0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
122d0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
122e0 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
122f0 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
12300 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
12310 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
12320 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
12330 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
12340 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
12350 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
12360 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
12370 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
12380 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
12390 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
123a0 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
123b0 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
123c0 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
123d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
123e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
123f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
12400 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
12410 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
12420 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
12430 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
12440 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
12450 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
12460 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
12470 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12480 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12490 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
124a0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
124b0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
124c0 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
124d0 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
124e0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
124f0 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
12500 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
12510 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
12520 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
12530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
12540 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12550 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12560 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
12570 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
12580 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
12590 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
125a0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
125b0 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
125c0 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
125d0 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
125e0 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
125f0 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
12600 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
12610 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
12620 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
12630 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
12640 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
12650 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
12660 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
12670 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
12680 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
12690 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
126a0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
126b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
126c0 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
126d0 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
126e0 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
126f0 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
12700 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
12710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12720 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
12730 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
12740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12750 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
12760 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
12770 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
12780 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12790 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
127a0 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
127b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
127c0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
127d0 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
127e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
127f0 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
12800 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
12810 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12820 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
12830 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
12840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12850 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
12860 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
12870 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
12880 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
12890 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
128a0 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
128b0 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
128c0 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
128d0 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
128e0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
128f0 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
12900 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
12910 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
12920 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
12930 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12940 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
12950 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
12960 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
12970 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
12980 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
12990 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
129a0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
129b0 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
129c0 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
129d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
129e0 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
129f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12a00 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
12a10 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
12a20 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
12a30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12a40 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
12a50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
12a60 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
12a70 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
12a80 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
12a90 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
12aa0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
12ab0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
12ac0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
12ad0 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
12ae0 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
12af0 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
12b00 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
12b10 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
12b20 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
12b30 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
12b40 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
12b50 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
12b60 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
12b70 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
12b80 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
12b90 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
12ba0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12bb0 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
12bc0 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
12bd0 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
12be0 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
12bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
12c00 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
12c10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
12c20 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
12c30 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
12c40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
12c50 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
12c60 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
12c70 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
12c80 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
12c90 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
12ca0 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
12cb0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
12cc0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
12cd0 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
12ce0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
12cf0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
12d00 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
12d10 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
12d20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
12d30 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
12d40 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
12d50 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
12d60 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
12d90 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
12da0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
12db0 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
12dc0 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
12dd0 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
12de0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
12e10 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
12e20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
12e30 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
12e40 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
12e50 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
12e60 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
12e70 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
12e80 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
12e90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
12ea0 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
12eb0 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
12ec0 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
12ed0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12ee0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
12ef0 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
12f00 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
12f10 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
12f20 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
12f30 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
12f40 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
12f50 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
12f60 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
12f70 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
12f80 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
12f90 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
12fa0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
12fb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
12fc0 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
12fd0 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20  t contain, at a 
12fe0 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20  minimum, one of 
12ff0 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
13000 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
13010 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
13020 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20   but not both.  
13030 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
13040 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
13050 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
13060 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
13070 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
13080 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20  d for a fast.** 
13090 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
130a0 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
130b0 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
130c0 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65  set, the IN inde
130d0 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65  x will.** be use
130e0 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
130f0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
13100 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
13110 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
13120 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
13130 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
13140 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
13150 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
13160 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
13170 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
13180 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
13190 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
131a0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
131b0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
131c0 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
131d0 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
131e0 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  cted columns are
131f0 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
13200 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
13210 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
13220 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
13230 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65  IMARY KEY or due
13240 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20   to.** a UNIQUE 
13250 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e  constraint or in
13260 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  dex..**.** When 
13270 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
13280 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  HIP is used (and
13290 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
132a0 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
132b0 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72   fast set member
132c0 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e  ship tests) then
132d0 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
132e0 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
132f0 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
13300 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c  umns> is a singl
13310 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
13320 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20  Y KEY column or 
13330 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e  an .** index can
13340 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74   be found with t
13350 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f  he specified <co
13360 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65  lumns> as its le
13370 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ft-most..**.** I
13380 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e  f the IN_INDEX_N
13390 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e  OOP_OK and IN_IN
133a0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61  DEX_MEMBERSHIP a
133b0 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a  re both set and.
133c0 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  ** if the RHS of
133d0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
133e0 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20   is a list (not 
133f0 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  a subquery) then
13400 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
13410 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68   might decide th
13420 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  at creating an e
13430 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20  phemeral b-tree 
13440 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a  for membership.*
13450 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f  * testing is too
13460 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72   expensive and r
13470 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
13480 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61  OOP.  In that ca
13490 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69  se, the.** calli
134a0 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  ng routine shoul
134b0 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  d implement the 
134c0 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e  IN operator usin
134d0 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  g a sequence.** 
134e0 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70  of Eq or Ne comp
134f0 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
13500 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
13510 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
13520 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
13530 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
13540 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
13550 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20  n.** might need 
13560 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
13570 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73  or not the RHS s
13580 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
13590 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69  erator.** contai
135a0 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ns a NULL.  If p
135b0 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e  rRhsHasNull is n
135c0 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ot a NULL pointe
135d0 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65  r and .** if the
135e0 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65  re is any chance
135f0 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13600 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
13610 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
13620 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
13630 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
13640 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
13650 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
13660 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
13670 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74  RhsHasNull. If t
13680 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
13690 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
136a0 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e   contains a.** N
136b0 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ULL value, then 
136c0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73  *prRhsHasNull is
136d0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
136e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
136f0 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
13700 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
13710 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
13720 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e  RhsHasNull, then
13730 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e  .** the value in
13740 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77   that register w
13750 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
13760 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
13770 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ns one or more.*
13780 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61  * NULL values, a
13790 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f  nd it will be so
137a0 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75  me non-NULL valu
137b0 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  e if the b-tree 
137c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e  contains no.** N
137d0 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ULL values..**.*
137e0 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70  * If the aiMap p
137f0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
13800 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f  NULL, it must po
13810 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
13820 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e  containing.** on
13830 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61  e element for ea
13840 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e  ch column return
13850 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
13860 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68   statement on th
13870 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20  e RHS.** of the 
13880 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
13890 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79  . The i'th entry
138a0 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
138b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
138c0 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66  the.** offset of
138d0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
138e0 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  n that matches t
138f0 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72  he i'th column r
13900 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
13910 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78  * SELECT. For ex
13920 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78  ample, if the ex
13930 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c  pression and sel
13940 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a  ected index are:
13950 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29  .**.**   (?,?,?)
13960 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62   IN (SELECT a, b
13970 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20  , c FROM t1).** 
13980 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
13990 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29  1 ON t1(b, c, a)
139a0 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d  ;.**.** then aiM
139b0 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65  ap[] is populate
139c0 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d  d with {2, 0, 1}
139d0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
139e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
139f0 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
13a00 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73  dInIndex(.  Pars
13a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13a20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
13a40 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20  xpr *pX,        
13a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13a60 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
13a70 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e   (RHS) of the IN
13a80 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   operator */.  u
13a90 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20  32 inFlags,     
13aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f            /* IN_
13ab0 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d  INDEX_LOOP, _MEM
13ac0 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20  BERSHIP, and/or 
13ad0 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e  _NOOP_OK */.  in
13ae0 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  t *prRhsHasNull,
13af0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
13b00 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c  ster holding NUL
13b10 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e  L status.  See n
13b20 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  otes */.  int *a
13b30 69 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  iMap            
13b40 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
13b50 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64  from Index field
13b60 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20  s to RHS fields 
13b70 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
13b80 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ba0 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72   SELECT to the r
13bb0 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61  ight of IN opera
13bc0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  tor */.  int eTy
13bd0 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13bf0 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61  * Type of RHS ta
13c00 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20  ble. IN_INDEX_* 
13c10 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
13c20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
13c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
13c40 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20  rsor of the RHS 
13c50 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
13c60 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20  ustBeUnique;    
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20   /* True if RHS 
13c90 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a  must be unique *
13ca0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
13cb0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13cc0 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72  rse);     /* Vir
13cd0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
13ce0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61  ng coded */..  a
13cf0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
13d00 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65  K_IN );.  mustBe
13d10 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67  Unique = (inFlag
13d20 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
13d30 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  P)!=0;..  /* If 
13d40 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20  the RHS of this 
13d50 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
13d60 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e   is a SELECT, an
13d70 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20  d if it matters 
13d80 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
13d90 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20   not the SELECT 
13da0 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20  result contains 
13db0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65  NULL values, che
13dc0 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  ck whether.  ** 
13dd0 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61  or not NULL is a
13de0 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
13df0 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c   (it may not be,
13e00 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75   for example, du
13e10 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e  e .  ** to NOT N
13e20 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
13e30 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20  in the schema). 
13e40 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  If no NULL value
13e50 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a  s are possible,.
13e60 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61    ** set prRhsHa
13e70 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72  sNull to 0 befor
13e80 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a  e continuing.  *
13e90 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73  /.  if( prRhsHas
13ea0 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61  Null && (pX->fla
13eb0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
13ec0 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  t) ){.    int i;
13ed0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
13ee0 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53  EList = pX->x.pS
13ef0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
13f00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
13f10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13f20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
13f30 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
13f40 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  l(pEList->a[i].p
13f50 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Expr) ) break;. 
13f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
13f70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
13f80 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e  .      prRhsHasN
13f90 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ull = 0;.    }. 
13fa0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
13fb0 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
13fc0 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
13fd0 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
13fe0 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
13ff0 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
14000 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
14010 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
14020 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
14030 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
14040 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14050 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61  ==0 && (p = isCa
14060 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
14070 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  pX))!=0 ){.    s
14080 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14090 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
140a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
140b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
140c0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
140f0 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
14100 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20      i16 iDb;    
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
14130 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
14140 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  Tab */.    ExprL
14150 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
14160 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  >pEList;.    int
14170 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
14180 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  >nExpr;..    ass
14190 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
141a0 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
141b0 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
141c0 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
141d0 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
141e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
141f0 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
14200 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
14210 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
14220 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
14230 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
14240 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14250 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
14260 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
14270 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
14280 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
14290 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20  ].pTab;..    /* 
142a0 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73  Code an OP_Trans
142b0 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61  action and OP_Ta
142c0 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62  bleLock for <tab
142d0 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20  le>. */.    iDb 
142e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
142f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
14300 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
14310 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14320 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
14330 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
14340 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14350 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14360 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
14370 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  e);..    assert(
14380 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47  v);  /* sqlite3G
14390 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77  etVdbe() has alw
143a0 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ays been previou
143b0 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20  sly called */.  
143c0 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
143d0 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
143e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
143f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
14400 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f  "x IN (SELECT ro
14410 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22  wid FROM table)"
14420 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69   case */.      i
14430 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
14440 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14450 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  OP_Once);.      
14460 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14470 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
14480 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
14490 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
144a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
144b0 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
144c0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
144d0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
144e0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
144f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 53  .            "US
14500 49 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43 48  ING ROWID SEARCH
14510 20 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52   ON TABLE %s FOR
14520 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54   IN-OPERATOR",pT
14530 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
14540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14550 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
14560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14570 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
145a0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
145b0 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
145c0 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20  ty_ok = 1;.     
145d0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f   int i;..      /
145e0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
145f0 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
14600 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
14610 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20  erform each .   
14620 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
14630 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
14640 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
14650 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
14660 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  able.      ** on
14670 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
14680 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
14690 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   it not, it is n
146a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20  ot possible to. 
146b0 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20       ** use any 
146c0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53  index of the RHS
146d0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
146e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
146f0 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  pr && affinity_o
14700 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
14710 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
14720 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
14730 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
14740 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
14750 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74  nt iCol = pEList
14760 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[i].pExpr->iC
14770 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63  olumn;.        c
14780 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c  har idxaff = sql
14790 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
147a0 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f  ffinity(pTab,iCo
147b0 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65  l); /* RHS table
147c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
147d0 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65   cmpaff = sqlite
147e0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
147f0 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a  (pLhs, idxaff);.
14800 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14810 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
14820 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
14830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63       testcase( c
14840 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  mpaff==SQLITE_AF
14850 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
14860 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
14870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
14880 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
14890 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
148a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
148b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
148c0 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
148d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d     /* sqlite3Com
148e0 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f  pareAffinity() o
148f0 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54  nly returns TEXT
14900 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   if one side or 
14910 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
14920 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20  ** other has no 
14930 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65  affinity and the
14940 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54   other side is T
14950 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20  EXT.  Hence,.   
14960 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
14970 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70  only way for cmp
14980 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69  aff to be TEXT i
14990 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20  s for idxaff to 
149a0 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20  be TEXT.        
149b0 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74      ** and for t
149c0 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c  he term on the L
149d0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20  HS of the IN to 
149e0 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79  have no affinity
149f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
14a00 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d   assert( idxaff=
14a10 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
14a20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14a30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14a40 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
14a50 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f        affinity_o
14a60 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  k = sqlite3IsNum
14a70 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
14a80 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aff);.        }.
14a90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
14aa0 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
14ab0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  {.        /* Sea
14ac0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
14ad0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
14ae0 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69  ill work for thi
14af0 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
14b00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
14b10 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
14b20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
14b30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
14b40 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42  xt){.          B
14b50 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20  itmask colUsed; 
14b60 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
14b70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  of the index use
14b80 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42  d */.          B
14b90 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20  itmask mCol;    
14ba0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72       /* Mask for
14bb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
14bc0 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  umn */.         
14bd0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
14be0 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69  mn<nExpr ) conti
14bf0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
14c00 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
14c10 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e 74  xWhere!=0 ) cont
14c20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
14c30 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
14c40 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
14c50 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
14c60 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
14c70 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
14c80 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
14c90 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
14ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
14cb0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14cc0 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
14cd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14ce0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
14cf0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
14d00 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
14d10 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
14d20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14d30 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
14d40 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
14d50 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
14d60 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
14d70 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
14d80 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
14d90 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
14da0 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
14db0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
14dc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
14dd0 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
14de0 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
14df0 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
14e00 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
14e10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
14e20 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
14e30 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
14e40 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
14e50 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
14e60 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
14e70 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
14e80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
14e90 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
14ea0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
14eb0 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
14ec0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
14ed0 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
14ee0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
14f00 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
14f10 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
14f20 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
14f30 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
14f40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
14f50 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
14f60 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
14f70 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
14f80 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
14f90 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
14fa0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
14fb0 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
14fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14fd0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
14fe0 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
14ff0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
15000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
15010 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
15020 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
15030 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
15040 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
15050 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
15060 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
15070 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
15080 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15090 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
150a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
150b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
150c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
150d0 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
150e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
150f0 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
15100 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
15110 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
15120 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
15130 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
15140 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
15150 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
15160 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
15170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
15180 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
15190 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
151a0 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
151b0 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
151c0 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
151d0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
151e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
151f0 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
15200 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
15210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
15220 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
15230 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
15240 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
15250 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
15260 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
15270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15280 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
15290 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
152a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  );.            E
152b0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
152c0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e 47            "USING
152f0 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e   INDEX %s FOR IN
15300 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d  -OPERATOR",pIdx-
15310 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
15320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15330 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
15340 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
15350 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
15360 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15370 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
15380 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
15390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
153a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
153b0 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
153c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
153d0 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
153e0 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
153f0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
15400 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
15410 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
15420 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
15430 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
15440 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  [0];.  .        
15450 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
15460 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  Null ){.#ifdef S
15470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
15480 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
15490 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
154a0 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
154b0 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
154c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
154d0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
154e0 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20  olumnsUsed, .   
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15500 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29  Tab, 0, 0, (u8*)
15510 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29  &mask, P4_INT64)
15520 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
15530 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
15540 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
15550 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
15560 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d       if( nExpr==
15570 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
15580 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
15590 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
155a0 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
155b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
155c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
155d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
155e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
155f0 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
15600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15610 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
15620 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ver indexes */. 
15630 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66       } /* End if
15640 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20  ( affinity_ok ) 
15650 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  */.    } /* End 
15660 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20  if not an rowid 
15670 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20  index */.  } /* 
15680 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  End attempt to o
15690 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e  ptimize using an
156a0 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20   index */..  /* 
156b0 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e  If no preexistin
156c0 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c  g index is avail
156d0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20  able for the IN 
156e0 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20  clause.  ** and 
156f0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
15700 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c   an allowed repl
15710 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
15720 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
15730 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c  rator is a list,
15740 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a   not a subquery.
15750 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
15760 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
15770 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
15780 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
15790 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
157a0 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
157b0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
157c0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
157d0 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
157e0 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
157f0 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
15800 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
15810 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
15820 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
15830 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
15840 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
15850 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
15860 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
15870 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
15880 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
15890 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
158a0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
158b0 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  EX_NOOP;.  }..  
158c0 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
158d0 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
158e0 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
158f0 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
15900 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
15910 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
15920 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
15930 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
15940 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
15950 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
15960 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
15970 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
15980 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
15990 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
159a0 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
159b0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
159c0 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
159d0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
159e0 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
159f0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
15a00 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
15a10 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
15a20 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
15a30 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
15a40 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
15a50 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
15a60 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
15a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15a80 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
15a90 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
15aa0 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
15ab0 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
15ac0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
15ad0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
15ae0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
15af0 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
15b00 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
15b10 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
15b20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
15b30 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
15b40 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
15b50 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
15b60 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Tab;.  }..  if( 
15b70 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d  aiMap && eType!=
15b80 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
15b90 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  SC && eType!=IN_
15ba0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
15bb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   ){.    int i, n
15bc0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
15bd0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
15be0 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
15bf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
15c00 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b  +) aiMap[i] = i;
15c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
15c20 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
15c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15c40 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
15c50 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
15c60 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
15c70 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
15c80 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
15c90 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
15ca0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
15cb0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
15cc0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
15cd0 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
15ce0 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
15cf0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
15d00 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
15d10 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
15d20 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
15d30 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
15d40 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
15d50 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
15d60 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
15d70 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
15d80 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
15d90 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
15da0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
15db0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15dc0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
15dd0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
15de0 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
15df0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
15e00 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
15e10 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
15e20 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
15e30 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
15e40 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
15e50 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
15e60 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
15e70 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
15e80 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
15e90 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
15ea0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
15eb0 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66  b, nVal+1);.  if
15ec0 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( zRet ){.    in
15ed0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
15ee0 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
15ef0 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d        Expr *pA =
15f00 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
15f10 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
15f20 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , i);.      char
15f30 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   a = sqlite3Expr
15f40 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20  Affinity(pA);.  
15f50 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
15f60 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b  ){.        zRet[
15f70 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  i] = sqlite3Comp
15f80 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c  areAffinity(pSel
15f90 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
15fa0 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20  ].pExpr, a);.   
15fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15fc0 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20    zRet[i] = a;. 
15fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15fe0 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c   zRet[nVal] = '\
15ff0 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0';.  }.  return
16000 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
16010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16020 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
16030 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72  .** Load the Par
16040 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
16050 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
16060 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65  gument with an e
16070 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
16080 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
16090 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
160a0 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
160b0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d  mns - expected M
160c0 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
160d0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
160e0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
160f0 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69  , int nActual, i
16100 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63  nt nExpect){.  c
16110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
16120 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65  = "sub-select re
16130 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73  turns %d columns
16140 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b   - expected %d";
16150 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
16160 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c  sg(pParse, zFmt,
16170 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63   nActual, nExpec
16180 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
16190 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
161a0 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
161b0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75   that has been u
161c0 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74  sed in a context
161d0 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20   where.** it is 
161e0 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49  not permitted. I
161f0 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
16200 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20  -select vector, 
16210 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a  this routine .**
16220 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65   loads the Parse
16230 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d   object with a m
16240 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16250 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16260 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16270 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16280 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72  cted 1".**.** Or
16290 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67  , if it is a reg
162a0 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74  ular scalar vect
162b0 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77  or:.**.**   "row
162c0 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a   value misused".
162d0 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
162e0 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
162f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16300 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69  Expr *pExpr){.#i
16310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16320 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
16330 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
16340 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
16350 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16360 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16370 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
16380 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
16390 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  r, 1);.  }else.#
163a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
163b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
163c0 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
163d0 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a   misused");.  }.
163e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
163f0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
16400 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
16410 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
16420 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
16430 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
16440 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
16450 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
16460 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
16470 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
16480 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
16490 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
164a0 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
164b0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
164c0 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
164d0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
164e0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
164f0 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
16500 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
16510 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
16520 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
16530 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
16540 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
16550 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
16560 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
16570 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
16580 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
16590 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
165a0 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
165b0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
165c0 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
165d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
165e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
165f0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
16600 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
16610 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
16620 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
16630 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
16640 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
16650 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
16660 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
16670 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
16680 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
16690 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
166a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
166b0 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
166c0 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
166d0 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
166e0 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
166f0 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
16700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
16710 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
16720 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
16730 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
16740 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
16750 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
16760 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
16770 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
16780 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
16790 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
167a0 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
167b0 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
167c0 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
167d0 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
167e0 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
167f0 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
16800 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
16810 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
16820 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
16830 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
16840 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
16850 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
16860 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
16870 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
16880 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
16890 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
168a0 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
168b0 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
168c0 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
168d0 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
168e0 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
168f0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
16900 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
16910 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
16920 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
16930 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
16940 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
16950 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
16960 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
16970 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
16980 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16990 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
169a0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
169b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
169c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
169d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
169e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
169f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
16a00 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
16a10 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
16a20 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
16a30 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
16a40 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
16a50 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
16a60 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
16a70 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
16a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16a90 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
16aa0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
16ab0 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
16ac0 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
16ad0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
16ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
16af0 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
16b00 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
16b10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
16b40 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
16b50 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
16b60 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16b70 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
16b80 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
16b90 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  0;..  /* The eva
16ba0 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
16bb0 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
16bc0 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
16bd0 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
16be0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
16bf0 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
16c00 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
16c10 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
16c20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
16c30 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
16c40 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
16c50 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
16c60 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
16c70 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
16c80 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
16c90 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
16ca0 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
16cb0 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
16cc0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
16cd0 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
16ce0 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
16cf0 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
16d00 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
16d10 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
16d20 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
16d30 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
16d40 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
16d50 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
16d60 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
16d70 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
16d80 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
16d90 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
16da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
16db0 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
16dc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16dd0 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
16de0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
16df0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
16e00 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e20 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
16e30 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
16e40 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
16e50 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
16e60 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
16e70 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16e80 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
16e90 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
16ea0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
16eb0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
16ec0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
16ed0 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
16ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16ef0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
16f00 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
16f10 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
16f20 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
16f30 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
16f40 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
16f50 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
16f60 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
16f70 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
16f80 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
16f90 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
16fa0 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
16fb0 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
16fc0 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
16fd0 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
16fe0 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
16ff0 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
17000 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
17010 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
17020 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
17030 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
17040 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
17050 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17060 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
17070 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
17080 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
17090 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
170a0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
170b0 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
170c0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
170d0 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
170e0 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
170f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
17100 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
17110 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
17120 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
17130 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
17140 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
17150 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
17160 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
17170 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
17180 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
17190 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
171a0 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
171b0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
171c0 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
171d0 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
171e0 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
171f0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17200 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
17210 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
17220 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
17230 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17240 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
17250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17260 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
17270 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
17280 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17290 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
172a0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
172b0 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
172c0 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
172d0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
172e0 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
172f0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
17300 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17310 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
17320 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
17330 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
17340 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
17350 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
17360 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17370 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
17380 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
17390 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
173a0 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
173b0 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
173c0 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
173d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
173e0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
173f0 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
17400 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
17410 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
17420 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
17430 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 45 78  ist;..        Ex
17440 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
17450 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49  pParse, 1, "%sLI
17460 53 54 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20  ST SUBQUERY",.  
17470 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
17480 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
17490 52 52 45 4c 41 54 45 44 20 22 0a 20 20 20 20 20  RRELATED ".     
174a0 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 61     ));.        a
174b0 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
174c0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
174d0 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53   the LHS and RHS
174e0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
174f0 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  tor do not match
17500 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  , that.        *
17510 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76  * error will hav
17520 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f  e been caught lo
17530 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61  ng before we rea
17540 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ch this point. *
17550 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  /.        if( AL
17560 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78  WAYS(pEList->nEx
17570 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20  pr==nVal) ){.   
17580 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
17590 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
175a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
175b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
175c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
175d0 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
175e0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
175f0 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74     dest.zAffSdst
17600 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
17610 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
17620 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
17630 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
17640 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
17650 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
17660 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
17670 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
17680 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
17690 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
176a0 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
176b0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
176c0 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
176d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
176e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
176f0 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
17700 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17710 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
17720 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
17730 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
17740 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
17750 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
17760 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17770 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
17780 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
17790 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
177a0 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
177b0 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
177c0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
177d0 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69  !=0 ); /* OOM wi
177e0 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66  ll cause exit af
177f0 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ter sqlite3Selec
17800 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t() */.         
17810 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
17820 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
17830 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
17840 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
17850 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
17860 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
17870 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
17880 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   );.          fo
17890 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
178a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
178b0 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
178c0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
178d0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
178e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79              pKey
178f0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
17900 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
17910 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
17930 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d  arse, p, pEList-
17940 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20  >a[i].pExpr.    
17950 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
17960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17970 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17980 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
17990 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
179a0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
179b0 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
179c0 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
179d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
179e0 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
179f0 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
17a00 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
17a10 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
17a20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
17a30 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
17a40 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
17a50 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
17a60 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
17a70 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
17a80 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
17a90 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
17aa0 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
17ab0 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
17ac0 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
17ad0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
17ae0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17af0 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
17b00 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
17b10 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
17b20 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a   LHS of the IN *
17b30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
17b40 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
17b50 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
17b60 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
17b70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17b80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
17b90 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
17ba0 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 20 20  r2, r3;.        
17bb0 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
17bc0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
17bd0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Left);.        i
17be0 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
17bf0 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
17c00 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
17c10 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BLOB;.        }.
17c20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
17c30 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
17c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17c50 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
17c60 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17c70 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
17c80 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
17c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
17ca0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
17cb0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
17cc0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
17cd0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
17ce0 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
17cf0 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
17d00 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
17d10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17d20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
17d30 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
17d40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17d50 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17d60 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  id ) sqlite3Vdbe
17d70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
17d80 62 2c 20 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c  b, 0, r2, 0, "",
17d90 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
17da0 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
17db0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
17dc0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
17dd0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
17de0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
17df0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
17e00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
17e10 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
17e20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
17e30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
17e40 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
17e50 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
17e60 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
17e70 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
17e80 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
17e90 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
17ea0 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
17eb0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
17ec0 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
17ed0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
17ee0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
17ef0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
17f00 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
17f10 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
17f20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
17f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17f40 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
17f50 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
17f60 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
17f70 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
17f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17f90 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
17fa0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
17fb0 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
17fc0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
17fd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
17fe0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
17ff0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
18000 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
18010 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
18020 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
18030 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
18040 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
18050 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
18060 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
18070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18080 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
18090 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
180a0 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
180b0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
180c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
180d0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
180e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
180f0 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
18100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
18110 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
18120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
18140 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18170 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
18180 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
18190 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
181a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
181b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
181c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
181d0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
181e0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
181f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
18200 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
18210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18220 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
18230 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
18240 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18270 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
18280 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
18290 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20  e, r2, r3, 1);. 
182a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
182b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
182c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
182d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
182e0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
182f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
18300 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18310 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
18320 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
18330 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
18340 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18350 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
18360 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
18370 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
18380 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
18390 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
183a0 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
183b0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
183c0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
183d0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
183e0 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52    (SELECT ... FR
183f0 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
18400 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53       or:    EXIS
18410 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  TS(SELECT ... FR
18420 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
18430 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
18440 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
18450 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
18460 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
18470 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20  columns of.     
18480 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f   ** the first ro
18490 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  w into an array 
184a0 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
184b0 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   return the inde
184c0 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  x of.      ** th
184d0 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
184e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
184f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
18500 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 20  n EXISTS, write 
18510 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
18520 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
18530 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a  exists).      **
18540 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18550 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
18560 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
18570 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18580 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65   ** In both case
18590 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73 20  s, the query is 
185a0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22  augmented with "
185b0 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a  LIMIT 1".  Any .
185c0 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73        ** preexis
185d0 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69  ting limit is di
185e0 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65  scarded in place
185f0 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49   of the new LIMI
18600 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  T 1..      */.  
18610 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
18620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
18640 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
18650 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
18660 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
18670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18680 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
18690 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
186a0 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  T result */.    
186b0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
186e0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
186f0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
18700 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78 70  /* New limit exp
18730 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  ression */..    
18740 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18750 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
18760 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18770 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18780 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
18790 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
187a0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
187b0 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
187c0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
187d0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
187e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
187f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18800 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
18810 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
18820 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
18830 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
18840 31 2c 20 22 25 73 53 43 41 4c 41 52 20 53 55 42  1, "%sSCALAR SUB
18850 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20  QUERY",.        
18860 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
18870 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
18880 45 44 20 22 29 29 3b 0a 20 20 20 20 20 20 6e 52  ED "));.      nR
18890 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  eg = pExpr->op==
188a0 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c  TK_SELECT ? pSel
188b0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
188c0 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 1;.      sqlit
188d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
188e0 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73  (&dest, 0, pPars
188f0 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20  e->nMem+1);.    
18900 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
18910 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66  = nReg;.      if
18920 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18930 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
18940 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
18950 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
18960 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73  dest.iSdst = des
18970 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
18980 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20     dest.nSdst = 
18990 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  nReg;.        sq
189a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
189b0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
189c0 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73  est.iSDParm, des
189d0 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31  t.iSDParm+nReg-1
189e0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
189f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
18a00 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
18a10 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
18a20 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
18a30 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
18a40 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
18a50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18a60 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
18a70 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
18a80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18a90 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
18aa0 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
18ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d      }.      pLim
18ac0 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
18ad0 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
18ae0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71  , TK_INTEGER,&sq
18af0 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
18b00 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
18b10 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSel->pLimit ){
18b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18b30 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
18b40 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
18b50 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  mit->pLeft);.   
18b60 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
18b70 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69  t->pLeft = pLimi
18b80 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
18b90 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c          pSel->pL
18ba0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
18bb0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
18bc0 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29  IMIT, pLimit, 0)
18bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18be0 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
18bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
18c00 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
18c10 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
18c20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18c30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18c40 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
18c50 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
18c60 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
18c70 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
18c80 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
18c90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
18ca0 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
18cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
18cc0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
18cd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
18ce0 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
18cf0 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
18d00 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
18d10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18d20 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
18d30 6d 69 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  mic);.  }..  ret
18d40 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
18d50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18d60 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
18d70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18d80 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
18d90 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
18da0 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
18db0 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
18dc0 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
18dd0 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
18de0 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
18df0 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
18e00 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
18e10 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
18e20 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
18e30 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
18e40 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
18e50 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
18e60 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
18e70 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
18e80 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
18e90 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
18ea0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
18eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
18ec0 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
18ed0 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
18ee0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
18ef0 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
18f00 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
18f10 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
18f20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
18f30 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
18f40 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
18f50 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
18f60 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
18f70 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
18f80 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
18f90 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
18fa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
18fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
18fc0 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
18fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63  {.    sqlite3Vec
18fe0 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72  torErrorMsg(pPar
18ff0 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  se, pIn->pLeft);
19000 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
19010 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19020 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
19030 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
19040 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
19050 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
19060 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
19070 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
19080 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
19090 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
190a0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
190b0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
190c0 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
190d0 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74  a scalar or vect
190e0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  or expression.  
190f0 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  The .** right-ha
19100 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73  nd side (RHS) is
19110 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
19120 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72  o or more scalar
19130 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a   values, or a.**
19140 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74   subquery.  If t
19150 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71  he RHS is a subq
19160 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  uery, the number
19170 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
19180 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68  ns must.** match
19190 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
191a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65  olumns in the ve
191b0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
191c0 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a    If the RHS is.
191d0 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  ** a list of val
191e0 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73  ues, the LHS mus
191f0 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a  t be a scalar. .
19200 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65  **.** The IN ope
19210 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66  rator is true if
19220 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69   the LHS value i
19230 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
19240 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54  in the RHS..** T
19250 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
19260 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
19270 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20   definitely not 
19280 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
19290 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e   .** result is N
192a0 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65  ULL if the prese
192b0 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  nce of the LHS i
192c0 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74  n the RHS cannot
192d0 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   be .** determin
192e0 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e  ed due to NULLs.
192f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19300 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
19310 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
19320 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
19330 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
19340 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
19350 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
19360 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
19370 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
19380 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
19390 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
193a0 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
193b0 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
193c0 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
193d0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
193e0 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
193f0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
19400 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70  *.** See the sep
19410 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f  arate in-operato
19420 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69  r.md documentati
19430 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63  on file in the c
19440 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69  anonical.** SQLi
19450 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66  te source tree f
19460 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
19470 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
19480 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
19490 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
194a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
194b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
194c0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
194d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
194e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
194f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
19500 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
19510 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
19520 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
19530 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
19540 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
19550 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
19560 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
19570 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19580 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
19590 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
195a0 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
195b0 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
195c0 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
195d0 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
195e0 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
195f0 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
19600 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
19610 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
19620 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
19630 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20   rLhs;          
19640 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73     /* Register(s
19650 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48  ) holding the LH
19660 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  S values */.  in
19670 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20  t rLhsOrig;     
19680 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65      /* LHS value
19690 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64  s prior to reord
196a0 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d  ering by aiMap[]
196b0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
196d0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
196e0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
196f0 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b   int *aiMap = 0;
19700 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
19710 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20  om vector field 
19720 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  to index column 
19730 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
19740 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66  = 0;       /* Af
19750 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
19760 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f  r comparisons */
19770 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20  .  int nVector; 
19780 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19790 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20   of vectors for 
197a0 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
197b0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79   */.  int iDummy
197c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
197d0 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74  ummy parameter t
197e0 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  o exprCodeVector
197f0 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  () */.  Expr *pL
19800 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eft;          /*
19810 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
19820 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
19830 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
19840 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63         /* loop c
19850 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
19860 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20  destStep2;      
19870 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
19880 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65  mp when NULLs se
19890 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a  en in step 2 */.
198a0 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20    int destStep6 
198b0 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74  = 0;    /* Start
198c0 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65   of code for Ste
198d0 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
198e0 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f  rTruthOp;      /
198f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63  * Address of opc
19900 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ode that determi
19910 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72  nes the IN is tr
19920 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ue */.  int dest
19930 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a  NotNull;      /*
19940 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20   Jump here if a 
19950 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
19960 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36  t true in step 6
19970 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
19980 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
19990 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36  op of the step-6
199a0 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65   loop */ ..  pLe
199b0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
199c0 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
199d0 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
199e0 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
199f0 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
19a00 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
19a10 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
19a20 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
19a30 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
19a40 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
19a50 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
19a60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
19a70 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
19a80 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
19a90 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
19aa0 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
19ab0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
19ac0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19ad0 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
19ae0 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
19af0 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
19b00 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
19b10 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
19b20 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
19b30 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
19b40 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
19b50 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
19b60 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
19b70 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70   ith cursor pExp
19b80 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20  r->iTable .  ** 
19b90 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
19ba0 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
19bb0 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f   the RHS. If IN_
19bc0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
19bd0 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
19be0 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74   RHS has not yet
19bf0 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f   been coded.  */
19c00 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
19c10 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
19c20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
19c30 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
19c40 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
19c50 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
19c60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
19c70 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
19c80 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
19c90 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
19ca0 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
19cd0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
19ce0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
19cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
19d10 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
19d20 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
19d30 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29  sHasNull, aiMap)
19d40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
19d50 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65  rse->nErr || nVe
19d60 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65  ctor==1 || eType
19d70 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20  ==IN_INDEX_EPH. 
19d80 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
19d90 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
19da0 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  SC || eType==IN_
19db0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
19dc0 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51   .  );.#ifdef SQ
19dd0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
19de0 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d  Confirm that aiM
19df0 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56  ap[] contains nV
19e00 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61  ector integer va
19e10 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61  lues between 0 a
19e20 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d  nd.  ** nVector-
19e30 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  1. */.  for(i=0;
19e40 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
19e50 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74  {.    int j, cnt
19e60 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d  ;.    for(cnt=j=
19e70 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b  0; j<nVector; j+
19e80 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d  +) if( aiMap[j]=
19e90 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  =i ) cnt++;.    
19ea0 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29  assert( cnt==1 )
19eb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19ec0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
19ed0 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
19ee0 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
19ef0 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69  )". If the LHS i
19f00 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72  s a .  ** vector
19f10 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f  , then it is sto
19f20 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
19f30 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73  of nVector regis
19f40 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20  ters starting . 
19f50 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a   ** at r1..  **.
19f60 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64    ** sqlite3Find
19f70 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20  InIndex() might 
19f80 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74  have reordered t
19f90 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
19fa0 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a   LHS vector.  **
19fb0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65   so that the fie
19fc0 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  lds are in the s
19fd0 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20  ame order as an 
19fe0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20  existing index. 
19ff0 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70    The.  ** aiMap
1a000 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
1a010 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  s a mapping from
1a020 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48   the original LH
1a030 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f  S field order to
1a040 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20  .  ** the field 
1a050 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68  order that match
1a060 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78  es the RHS index
1a070 2e 0a 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69  ..  */.  rLhsOri
1a080 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74  g = exprCodeVect
1a090 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  or(pParse, pLeft
1a0a0 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f  , &iDummy);.  fo
1a0b0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1a0c0 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b   && aiMap[i]==i;
1a0d0 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c   i++){} /* Are L
1a0e0 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65  HS fields reorde
1a0f0 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d  red? */.  if( i=
1a100 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20  =nVector ){.    
1a110 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72  /* LHS fields ar
1a120 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20  e not reordered 
1a130 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c  */.    rLhs = rL
1a140 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b  hsOrig;.  }else{
1a150 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1a160 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20  reorder the LHS 
1a170 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67  fields according
1a180 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20   to aiMap */.   
1a190 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47   rLhs = sqlite3G
1a1a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1a1b0 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  se, nVector);.  
1a1c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1a1d0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1a1e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a1f0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
1a200 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73  rLhsOrig+i, rLhs
1a210 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20  +aiMap[i], 0);. 
1a220 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1a230 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  f sqlite3FindInI
1a240 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66  ndex() did not f
1a250 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e  ind or create an
1a260 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20   index that is. 
1a270 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72   ** suitable for
1a280 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
1a290 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  IN operator, the
1a2a0 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67  n evaluate using
1a2b0 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65   a.  ** sequence
1a2c0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
1a2d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1a2e0 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74  is step (1) in t
1a2f0 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  he in-operator.m
1a300 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f  d optimized algo
1a310 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  rithm..  */.  if
1a320 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
1a330 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
1a340 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1a350 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1a360 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1a370 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1a380 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a390 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1a3a0 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
1a3b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a3c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
1a3d0 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
1a3e0 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
1a3f0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
1a400 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
1a410 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1a420 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1a430 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1a440 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
1a450 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1a460 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
1a470 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1a480 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1a490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a4a0 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
1a4b0 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
1a4c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
1a4d0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
1a4e0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
1a4f0 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
1a500 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a510 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
1a520 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
1a530 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
1a540 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
1a550 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1a560 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
1a570 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
1a580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a590 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1a5a0 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
1a5b0 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
1a5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a5d0 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
1a5e0 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
1a5f0 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1a600 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a620 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
1a630 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1a660 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1a670 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a680 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
1a690 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1a6a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a6b0 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
1a6c0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1a6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a6e0 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1a6f0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1a700 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1a710 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1a720 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
1a730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a740 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1a750 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
1a760 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1a790 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
1a7a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a7c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
1a7d0 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
1a7e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1a7f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a800 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a810 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
1a820 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a830 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
1a840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a850 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1a860 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
1a870 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
1a880 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1a8a0 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1a8b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1a8c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a8d0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
1a8e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1a8f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a900 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
1a910 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
1a920 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1a930 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
1a940 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
1a950 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
1a960 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
1a970 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
1a980 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
1a990 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
1a9a0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1a9b0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
1a9c0 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
1a9d0 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
1a9e0 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
1a9f0 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
1aa00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1aa10 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1aa20 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
1aa30 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
1aa40 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
1aa50 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
1aa60 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
1aa70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1aa80 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1aa90 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1aaa0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
1aab0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1aac0 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72  eldSubexpr(pExpr
1aad0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
1aae0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1aaf0 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a  CanBeNull(p) ){.
1ab00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ab10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1ab20 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65  Null, rLhs+i, de
1ab30 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20  stStep2);.      
1ab40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ab50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ab60 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48   Step 3.  The LH
1ab70 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74  S is now known t
1ab80 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  o be non-NULL.  
1ab90 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  Do the binary se
1aba0 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  arch.  ** of the
1abb0 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c   RHS using the L
1abc0 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20  HS as a probe.  
1abd0 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65  If found, the re
1abe0 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75  sult is.  ** tru
1abf0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1ac00 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
1ac10 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  WID ){.    /* In
1ac20 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1ac30 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
1ac40 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
1ac50 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a   and so we also.
1ac60 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74      ** know that
1ac70 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d   the RHS is non-
1ac80 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65  NULL.  Hence, we
1ac90 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33   combine steps 3
1aca0 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e   and 4.    ** in
1acb0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1acc0 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  de. */.    sqlit
1acd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1ace0 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45  OP_SeekRowid, pE
1acf0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1ad00 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b  tIfFalse, rLhs);
1ad10 0a 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 61 64 64 72 54 72  e(v);.    addrTr
1ad30 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1ad40 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1ad50 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72  Goto);  /* Retur
1ad60 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73  n True */.  }els
1ad70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
1ad80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1ad90 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e  ffinity, rLhs, n
1ada0 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c  Vector, 0, zAff,
1adb0 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69   nVector);.    i
1adc0 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
1add0 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
1ade0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53      /* Combine S
1adf0 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35  tep 3 and Step 5
1ae00 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1ae10 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73  pcode */.      s
1ae20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ae30 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1ae40 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1ae50 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a  e, destIfFalse,.
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1ae80 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1ae90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1aea0 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1aeb0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1aec0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1aed0 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c  Ordinary Step 3,
1aee0 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
1aef0 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55  ere FALSE and NU
1af00 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  LL are distinct 
1af10 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  */.    addrTruth
1af20 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1af30 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1af40 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
1af50 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  able, 0,.       
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1af80 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1af90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1afa0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34    }..  /* Step 4
1afb0 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
1afc0 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
1afd0 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64  -NULL and we did
1afe0 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61   not find.  ** a
1aff0 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73  n match on the s
1b000 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65  earch above, the
1b010 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
1b020 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f  t be FALSE..  */
1b030 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75  .  if( rRhsHasNu
1b040 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31  ll && nVector==1
1b050 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b070 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  NotNull, rRhsHas
1b080 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73  Null, destIfFals
1b090 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
1b0a0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1b0b0 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77  /* Step 5.  If w
1b0c0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b0d0 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e  out the differen
1b0e0 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20  ce between NULL 
1b0f0 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20  and.  ** FALSE, 
1b100 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1b110 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20   false. .  */.  
1b120 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1b130 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71  =destIfNull ) sq
1b140 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b150 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a   destIfFalse);..
1b160 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f    /* Step 6: Loo
1b170 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f  p through rows o
1b180 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70  f the RHS.  Comp
1b190 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20  are each row to 
1b1a0 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66  the LHS..  ** If
1b1b0 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   any comparison 
1b1c0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
1b1d0 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
1b1e0 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63  .  If all.  ** c
1b1f0 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46  omparisons are F
1b200 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69  ALSE then the fi
1b210 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41  nal result is FA
1b220 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  LSE..  **.  ** F
1b230 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c  or a scalar LHS,
1b240 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
1b250 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20  t to check just 
1b260 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20  the first row.  
1b270 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ** of the RHS.. 
1b280 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74   */.  if( destSt
1b290 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62  ep6 ) sqlite3Vdb
1b2a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b2b0 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61   destStep6);.  a
1b2c0 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
1b2d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b2e0 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
1b2f0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1b300 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  lse);.  VdbeCove
1b310 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e  rage(v);.  if( n
1b320 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1b330 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  destNotNull = sq
1b340 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b350 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  el(v);.  }else{.
1b360 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74      /* For nVect
1b370 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73  or==1, combine s
1b380 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20  teps 6 and 7 by 
1b390 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
1b3a0 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c  rning.    ** FAL
1b3b0 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20  SE if the first 
1b3c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
1b3d0 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65  t NULL */.    de
1b3e0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74  stNotNull = dest
1b3f0 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66  IfFalse;.  }.  f
1b400 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1b410 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1b420 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  r *p;.    CollSe
1b430 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
1b440 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65  t r3 = sqlite3Ge
1b450 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1b460 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1b470 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1b480 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
1b490 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1b4a0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1b4b0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71  arse, p);.    sq
1b4c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b4d0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
1b4e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20  xpr->iTable, i, 
1b4f0 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r3);.    sqlite3
1b500 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1b510 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  _Ne, rLhs+i, des
1b520 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20  tNotNull, r3,.  
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1b550 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1b560 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b570 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1b580 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b590 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20  arse, r3);.  }. 
1b5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b5b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1b5c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1b5d0 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29   if( nVector>1 )
1b5e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b5f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b600 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20   destNotNull);. 
1b610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b620 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1b630 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b640 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20  addrTop+1);.    
1b650 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b660 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a  ..    /* Step 7:
1b670 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
1b680 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
1b690 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  w that the resul
1b6a0 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  t must.    ** be
1b6b0 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73   false. */.    s
1b6c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b6d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b6e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b6f0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65  }..  /* Jumps he
1b700 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  re in order to r
1b710 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20  eturn true. */. 
1b720 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1b730 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74  Here(v, addrTrut
1b740 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78  hOp);..sqlite3Ex
1b750 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1b760 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72  d:.  if( rLhs!=r
1b770 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65  LhsOrig ) sqlite
1b780 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b790 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20  pParse, rLhs);. 
1b7a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b7b0 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1b7c0 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1b7d0 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1b7e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1b7f0 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1b800 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1b810 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1b820 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1b830 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1b840 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1b850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1b860 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1b870 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1b880 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1b890 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1b8a0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1b8b0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1b8c0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1b8d0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1b8e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1b8f0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1b900 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1b910 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1b920 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1b930 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1b940 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1b950 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1b960 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1b970 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1b980 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1b990 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b9a0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1b9b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1b9c0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1b9d0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1b9e0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1b9f0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1ba00 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1ba10 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1ba20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ba30 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1ba40 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1ba50 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1ba60 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1ba70 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1ba80 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1ba90 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1baa0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1bab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bac0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1bad0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1bae0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1baf0 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1bb00 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1bb10 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1bb20 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1bb30 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1bb40 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1bb50 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1bb60 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1bb70 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1bb80 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1bb90 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1bba0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1bbb0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1bbc0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1bbd0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1bbe0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1bbf0 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1bc00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1bc10 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1bc20 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1bc30 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1bc40 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1bc50 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1bc60 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1bc70 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1bc80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bc90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1bca0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1bcb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1bcc0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1bcd0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1bce0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1bcf0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1bd00 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1bd10 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1bd20 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1bd30 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1bd40 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1bd50 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1bd60 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1bd70 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1bd80 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1bd90 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1bda0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1bdb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1bdc0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1bdd0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1bde0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1bdf0 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1be00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1be10 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1be20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1be30 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1be40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1be50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1be60 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1be70 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1be80 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1be90 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1bea0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1beb0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1bec0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1bed0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1bee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1bef0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1bf00 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1bf10 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1bf20 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1bf30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1bf40 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1bf50 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1bf60 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1bf70 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1bf80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20     }.  }.}.../* 
1bf90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1bfa0 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74  at will load int
1bfb0 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75  o register regOu
1bfc0 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  t a value that i
1bfd0 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  s.** appropriate
1bfe0 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c   for the iIdxCol
1bff0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
1c000 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69  dex pIdx..*/.voi
1c010 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1c020 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
1c030 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1c040 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e,  /* The parsi
1c050 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c060 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
1c070 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
1c080 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20  se column is to 
1c090 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1c0a0 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1c0b0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1c0c0 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77  g to a table row
1c0d0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f   */.  int iIdxCo
1c0e0 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l,    /* The col
1c0f0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1c100 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c110 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1c120 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1c130 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c  index column val
1c140 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1c150 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ter */.){.  i16 
1c160 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iTabCol = pIdx->
1c170 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c  aiColumn[iIdxCol
1c180 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c  ];.  if( iTabCol
1c190 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
1c1a0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1c1b0 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61  ColExpr );.    a
1c1c0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1c1d0 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64  lExpr->nExpr>iId
1c1e0 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72  xCol );.    pPar
1c1f0 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69  se->iSelfTab = i
1c200 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20  TabCur + 1;.    
1c210 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1c220 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
1c230 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
1c240 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
1c250 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73  gOut);.    pPars
1c260 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b  e->iSelfTab = 0;
1c270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1c280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1c290 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50  ColumnOfTable(pP
1c2a0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64  arse->pVdbe, pId
1c2b0 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43  x->pTable, iTabC
1c2c0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c          iTabCol,
1c2f0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1c300 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c310 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1c320 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1c330 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
1c340 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
1c350 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c360 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1c370 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
1c380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1c390 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
1c3a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
1c3b0 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
1c3c0 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1c3d0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
1c3e0 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1c3f0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1c400 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
1c410 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
1c420 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
1c430 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1c440 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1c450 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
1c460 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
1c470 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
1c480 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
1c490 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1c4a0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d  /.){.  if( pTab=
1c4b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c4c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1c4d0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75  P_Column, iTabCu
1c4e0 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  r, iCol, regOut)
1c4f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1c500 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  }.  if( iCol<0 |
1c510 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
1c520 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
1c530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c540 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
1c550 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
1c560 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
1c570 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
1c580 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
1c590 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
1c5a0 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20  int x = iCol;.  
1c5b0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
1c5c0 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74  pTab) && !IsVirt
1c5d0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
1c5e0 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
1c5f0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
1c600 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
1c610 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
1c620 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c630 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c640 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
1c650 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
1c660 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1c670 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
1c680 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
1c690 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1c6a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1c6b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c6c0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
1c6d0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
1c6e0 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
1c6f0 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
1c700 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
1c710 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
1c720 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1c730 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1c740 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
1c750 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
1c760 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
1c770 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
1c780 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
1c790 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
1c7a0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
1c7b0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
1c7c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c7d0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1c7e0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1c7f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1c800 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1c810 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c820 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1c830 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1c840 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1c850 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1c860 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1c870 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1c880 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1c890 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1c8a0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1c8b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1c8c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1c8d0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
1c8e0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1c8f0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
1c900 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
1c910 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
1c920 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
1c930 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c940 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
1c950 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
1c960 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c970 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
1c980 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
1c990 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1c9a0 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
1c9b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1c9c0 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20  5(v, p5);.  }.  
1c9d0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1c9e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c9f0 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
1ca00 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
1ca10 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
1ca20 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
1ca30 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
1ca40 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  -1..*/.void sqli
1ca50 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
1ca60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1ca70 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1ca80 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
1ca90 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
1caa0 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
1cab0 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
1cac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cad0 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
1cae0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
1caf0 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a   iTo, nReg);.}..
1cb00 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1cb10 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1cb20 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1cb30 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63  EGISTER referenc
1cb40 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ing.** register 
1cb50 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65  iReg.  The calle
1cb60 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
1cb70 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20  at iReg already 
1cb80 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
1cb90 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1cba0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1cbb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cbc0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1cbd0 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
1cbe0 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
1cbf0 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
1cc00 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
1cc10 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
1cc20 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
1cc30 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
1cc40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
1cc50 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1cc60 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63 74  n (either a vect
1cc70 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65  or or a scalar e
1cc80 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73  xpression) and s
1cc90 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  tore.** the resu
1cca0 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75  lt in continguou
1ccb0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1ccc0 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74  sters.  Return t
1ccd0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1cce0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
1ccf0 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  r used to store 
1cd00 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1cd10 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
1cd20 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1cd30 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1cd40 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c   scalar, then al
1cd50 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74  so write.** that
1cd60 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1cd70 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c   into *piFreeabl
1cd80 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  e.  If the retur
1cd90 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73  ned result regis
1cda0 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  ter.** is not a 
1cdb0 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20  temporary or if 
1cdc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1cdd0 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a  s a vector set *
1cde0 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f  piFreeable.** to
1cdf0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1ce00 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  t exprCodeVector
1ce10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ce20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69  Expr *p, int *pi
1ce30 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74  Freeable){.  int
1ce40 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20   iResult;.  int 
1ce50 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
1ce60 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
1ce70 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c  p);.  if( nResul
1ce80 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73  t==1 ){.    iRes
1ce90 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1cea0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ceb0 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29  , p, piFreeable)
1cec0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
1ced0 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a  piFreeable = 0;.
1cee0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
1cef0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20  K_SELECT ){.#if 
1cf00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1cf10 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73 75  UERY.      iResu
1cf20 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  lt = 0;.#else.  
1cf30 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1cf40 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1cf50 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c  ct(pParse, p, 0,
1cf60 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1cf70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1cf80 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1cf90 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1cfa0 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1cfb0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1cfc0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1cfd0 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1cfe0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1cff0 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1d000 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1d010 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1d020 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1d030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d040 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1d050 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1d060 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1d070 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1d080 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1d090 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1d0a0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1d0b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1d0c0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1d0d0 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1d0e0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1d0f0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1d100 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1d110 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1d120 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1d130 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1d140 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1d150 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1d160 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1d170 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1d180 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1d190 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1d1a0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1d1b0 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1d1c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1d1d0 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1d1e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1d1f0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1d200 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1d210 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1d220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1d230 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1d240 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d250 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1d260 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1d270 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1d280 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1d290 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1d2a0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d2c0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1d2d0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1d2e0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1d2f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1d300 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1d310 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1d320 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d330 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1d340 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1d350 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1d360 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1d370 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1d380 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d390 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d3a0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d3b0 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d3d0 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1d3e0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1d3f0 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1d400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1d410 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1d420 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1d430 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1d440 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1d450 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1d460 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1d470 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1d480 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1d490 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1d4a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1d4b0 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72  expr_code_doover
1d4c0 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  :.  if( pExpr==0
1d4d0 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
1d4e0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
1d4f0 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
1d500 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
1d510 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1d520 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1d530 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1d540 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
1d550 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
1d560 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d570 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
1d580 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
1d590 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
1d5a0 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
1d5b0 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
1d5c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1d5d0 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
1d5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f        return pCo
1d5f0 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  l->iMem;.      }
1d600 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
1d610 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
1d620 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d630 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1d640 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
1d650 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
1d660 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  PTab,.          
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1d690 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  rColumn, target)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d6b0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1d6c0 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
1d6d0 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
1d6e0 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
1d6f0 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
1d700 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1d710 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
1d720 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
1d730 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
1d740 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d750 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43  pExpr, EP_FixedC
1d760 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ol) ){.        /
1d770 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78  * This COLUMN ex
1d780 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 61 6c  pression is real
1d790 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75  ly a constant du
1d7a0 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e to WHERE claus
1d7b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  e.        ** con
1d7c0 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68  straints, and th
1d7d0 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 63  at constant is c
1d7e0 6f 64 65 64 20 62 79 20 74 68 65 20 70 45 78 70  oded by the pExp
1d7f0 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 20  r->pLeft.       
1d800 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f 6e 2e   ** expresssion.
1d810 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20    However, make 
1d820 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74 61 6e  sure the constan
1d830 74 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  t has the correc
1d840 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  t.        ** dat
1d850 61 74 79 70 65 20 62 79 20 61 70 70 6c 79 69 6e  atype by applyin
1d860 67 20 74 68 65 20 41 66 66 69 6e 69 74 79 20 6f  g the Affinity o
1d870 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1d880 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  mn to the.      
1d890 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20    ** constant.. 
1d8a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d8b0 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73 71 6c    int iReg = sql
1d8c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1d8d0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1d8e0 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b  ->pLeft,target);
1d8f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66  .        int aff
1d900 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
1d910 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45  olumnAffinity(pE
1d920 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78  xpr->y.pTab, pEx
1d930 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1d940 20 20 20 20 20 20 69 66 28 20 61 66 66 21 3d 53        if( aff!=S
1d950 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
1d960 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1d970 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41  ic const char zA
1d980 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30  ff[] = "B\000C\0
1d990 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20 20  00D\000E";.     
1d9a0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1d9b0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41  ITE_AFF_BLOB=='A
1d9c0 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ' );.          a
1d9d0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46  ssert( SQLITE_AF
1d9e0 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20  F_TEXT=='B' );. 
1d9f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
1da00 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
1da10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1da20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1da30 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61  _SCopy, iReg, ta
1da40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
1da50 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65 74     iReg = target
1da60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1da70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1da80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1da90 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20  Affinity, iReg, 
1daa0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42 27    &zAff[(aff-'B'
1dad0 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  )*2], P4_STATIC)
1dae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1daf0 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b      return iReg;
1db00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1db10 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20  f( iTab<0 ){.   
1db20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
1db30 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20  >iSelfTab<0 ){. 
1db40 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1db50 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
1db60 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
1db70 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
1db80 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
1db90 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1dba0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50  pr->iColumn - pP
1dbb0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
1dbc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69           /* Codi
1dbe0 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
1dbf0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
1dc00 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20   an index where 
1dc10 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20  column names.   
1dc20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
1dc30 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20   index refer to 
1dc40 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69  the table to whi
1dc50 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c  ch the index bel
1dc60 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ongs */.        
1dc70 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
1dc80 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20  >iSelfTab - 1;. 
1dc90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1dcb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1dcc0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1dcd0 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20  Expr->y.pTab,.  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1dd00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1dd10 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1dd40 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op2);.    }.   
1dd50 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1dd60 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1dd70 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1dd80 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1dd90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1dda0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1ddb0 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  case TK_TRUEFALS
1ddc0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1ddd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dde0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69  OP_Integer, sqli
1ddf0 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
1de00 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65 74  e(pExpr), target
1de10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1de20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1de30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1de40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1de50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
1de60 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1de70 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1de80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1de90 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1dea0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
1deb0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1dec0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ded0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1dee0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1def0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1df00 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1df10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1df20 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1df30 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
1df40 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1df50 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
1df60 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1df70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1df80 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1df90 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
1dfa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1dfb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1dfc0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
1dfd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1dfe0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1dff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e000 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1e010 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1e020 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1e030 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e040 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
1e050 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
1e060 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e070 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e080 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e090 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e0a0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
1e0b0 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
1e0c0 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
1e0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e0e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1e0f0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1e100 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
1e110 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
1e120 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e130 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
1e140 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
1e150 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
1e160 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
1e170 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
1e180 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
1e190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e1a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
1e1b0 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
1e1c0 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
1e1d0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  AMIC);.      ret
1e1e0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e1f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1e200 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
1e210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e220 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e230 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e240 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1e250 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e260 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
1e270 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e280 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
1e290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e2a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e2b0 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
1e2c0 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
1e2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
1e2e0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
1e2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1e300 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1e310 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e  lite3VListNumToN
1e320 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  ame(pParse->pVLi
1e330 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  st, pExpr->iColu
1e340 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  mn);.        ass
1e350 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e360 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20  oken[0]=='?' || 
1e370 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  strcmp(pExpr->u.
1e380 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b  zToken, z)==0 );
1e390 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1e3a0 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20  >pVList[0] = 0; 
1e3b0 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73  /* Indicate VLis
1e3c0 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20  t may no longer 
1e3d0 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1e3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e3f0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63  beAppendP4(v, (c
1e400 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49  har*)z, P4_STATI
1e410 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
1e420 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e430 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e440 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1e450 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
1e460 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
1e470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e480 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
1e490 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
1e4a0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1e4b0 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
1e4c0 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
1e4d0 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
1e4e0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1e4f0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1e500 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e510 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
1e520 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1e530 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1e540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e550 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1e560 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
1e570 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
1e580 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1e590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e5a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73  AddOp2(v, OP_Cas
1e5b0 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  t, target,.     
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
1e5e0 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
1e5f0 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  zToken, 0));.   
1e600 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b     return inReg;
1e610 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1e620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1e630 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1e640 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1e650 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1e660 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1e670 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1e680 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1e690 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1e6a0 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1e6b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1e6c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1e6d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1e6e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1e6f0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1e700 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1e710 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1e720 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1e730 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1e740 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1e750 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1e760 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1e770 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1e780 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1e790 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1e7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1e7b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e7c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e7d0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e7e0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1e7f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e800 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e810 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e820 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1e830 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1e840 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1e850 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1e860 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1e870 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1e880 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1e890 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e8a0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1e8b0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1e8c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e8d0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1e8e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e8f0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1e900 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1e910 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e920 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1e930 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1e940 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1e950 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1e960 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e970 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1e980 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1e990 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1e9a0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1e9b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e9c0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1e9d0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1e9e0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1e9f0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1ea00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ea10 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1ea20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1ea30 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1ea40 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1ea50 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ea60 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1ea70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ea80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ea90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eaa0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1eab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1eac0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ead0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1eae0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1eaf0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1eb00 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1eb10 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1eb20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1eb30 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1eb40 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1eb50 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1eb60 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1eb70 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1eb80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1eb90 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1eba0 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1ebb0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1ebc0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1ebd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ebe0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1ebf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ec00 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1ec10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ec20 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1ec30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ec40 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1ec50 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1ec60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1ec70 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1ec80 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1ec90 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1eca0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ecb0 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1ecc0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1ecd0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1ece0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ecf0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1ed00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1ed10 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1ed20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1ed30 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1ed40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ed50 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1ed60 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1ed70 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1ed80 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1ed90 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1eda0 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1edb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1edc0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1edd0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1ede0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1edf0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1ee00 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1ee10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ee20 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1ee30 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1ee40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1ee50 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1ee60 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1ee70 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1ee80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ee90 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1eea0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1eeb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eec0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1eed0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1eee0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1eef0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ef00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ef10 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1ef20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ef30 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1ef40 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1ef50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ef60 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1ef70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ef80 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1ef90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1efa0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1efb0 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1efc0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1efd0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1efe0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1eff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1f000 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1f010 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1f020 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1f030 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1f040 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1f050 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64  rn target;.#ifnd
1f060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1f070 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1f080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
1f090 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
1f0a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
1f0b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f0c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f0d0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f0e0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1f0f0 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
1f100 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1f110 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1f120 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  get;.#endif.    
1f130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f140 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
1f150 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
1f160 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
1f170 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
1f180 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
1f190 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
1f1a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
1f1b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f1c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
1f1d0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
1f1e0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1f1f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f200 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f210 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f220 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
1f230 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f240 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
1f250 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1f260 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f270 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1f290 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f2a0 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
1f2b0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1f2c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f2d0 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
1f2e0 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61  tNot );   testca
1f2f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
1f300 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1f310 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
1f320 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73  t );         tes
1f330 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f340 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1f350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f360 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f370 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f380 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1f390 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f3a0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f3b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f3c0 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
1f3d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f3e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
1f3f0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
1f400 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20  t isTrue;    /* 
1f410 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  IS TRUE or IS NO
1f420 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
1f430 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f  int bNormal;   /
1f440 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
1f450 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72  FALSE */.      r
1f460 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f470 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f480 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1f490 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f4a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f4b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  e1==0 );.      i
1f4c0 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45  sTrue = sqlite3E
1f4d0 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
1f4e0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1f4f0 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45      bNormal = pE
1f500 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b  xpr->op2==TK_IS;
1f510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f520 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d   isTrue && bNorm
1f530 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  al);.      testc
1f540 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
1f550 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20  bNormal);.      
1f560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f570 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75  4Int(v, OP_IsTru
1f580 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69  e, r1, inReg, !i
1f590 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20  sTrue, isTrue ^ 
1f5a0 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20  bNormal);.      
1f5b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f5c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1f5d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1f5e0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
1f5f0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
1f600 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1f610 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
1f620 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f630 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1f640 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
1f650 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
1f660 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
1f670 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1f680 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f690 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1f6a0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
1f6b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f6c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f6d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f6e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f6f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f700 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f710 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
1f720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1f730 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
1f740 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1f750 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
1f760 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
1f770 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1f780 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
1f790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f7a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1f7b0 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
1f7c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f7d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1f7e0 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
1f7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f800 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1f810 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1f820 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
1f830 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
1f840 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
1f850 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f860 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f870 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1f880 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1f890 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f8a0 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
1f8b0 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
1f8c0 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  %s()", pExpr->u.
1f8d0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1f8e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1f8f0 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  turn pInfo->aFun
1f900 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
1f910 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
1f920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f930 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
1f940 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
1f950 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
1f960 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f970 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1f980 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
1f990 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
1f9a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f9b0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1f9c0 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
1f9d0 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
1f9e0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1f9f0 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
1fa00 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ject */.      co
1fa10 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
1fa20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
1fa30 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
1fa40 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b     u32 constMask
1fa50 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73   = 0;     /* Mas
1fa60 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  k of function ar
1fa70 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  guments that are
1fa80 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
1fa90 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1faa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1fab0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1fac0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1fad0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
1fae0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1faf0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
1fb00 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
1fb10 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
1fb20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
1fb30 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
1fb40 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
1fb50 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1fb60 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
1fb70 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
1fb80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fb90 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
1fba0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1fbb0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fbc0 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
1fbd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1fbe0 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67  xpr->y.pWin->reg
1fbf0 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  Result;.      }.
1fc00 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
1fc10 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1fc20 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74  pParse) && sqlit
1fc30 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1fc40 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29  NotJoin(pExpr) )
1fc50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
1fc60 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62   functions can b
1fc70 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20  e expensive. So 
1fc80 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73  try to move cons
1fc90 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20  tant functions. 
1fca0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66         ** out of
1fcb0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c   the inner loop,
1fcc0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
1fcd0 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f  ans an extra OP_
1fce0 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Copy. */.       
1fcf0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1fd00 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1fd10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
1fd20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fd30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fd40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fd50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1fd60 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1fd70 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1fd80 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1fd90 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1fda0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1fdb0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1fdc0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1fdd0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1fde0 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
1fdf0 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
1fe00 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
1fe10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1fe20 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1fe30 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
1fe40 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
1fe50 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  oken;.      pDef
1fe60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1fe70 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
1fe80 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1fe90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1fea0 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
1feb0 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20  _FUNCTION.      
1fec0 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70  if( pDef==0 && p
1fed0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
1fee0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1fef0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1ff00 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77  tion(db, "unknow
1ff10 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  n", nFarg, enc, 
1ff20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
1ff30 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
1ff40 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
1ff50 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
1ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ff70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1ff80 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
1ff90 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20   %s()", zId);.  
1ffa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ffb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1ffc0 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
1ffd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1ffe0 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
1fff0 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
20000 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
20010 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
20020 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
20030 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  ary evaluation o
20040 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
20050 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
20060 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
20070 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
20080 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
20090 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
200a0 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
200b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
200c0 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
200d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
200e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
200f0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
20100 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20110 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20120 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
20130 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20140 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
20150 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
20160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20180 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
20190 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
201a0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
201b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
201c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
201d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
201e0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
201f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20200 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
20210 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20220 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
20230 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
20240 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20250 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
20260 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
20270 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
20280 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
20290 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
202a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
202b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
202c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
202d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
202e0 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
202f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20300 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
20310 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20320 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
20330 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20340 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
20350 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66  t);.      }..#if
20360 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20370 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46  .      /* The AF
20380 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f  FINITY() functio
20390 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
203a0 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
203b0 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20  cribes.      ** 
203c0 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
203d0 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
203e0 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  t.  This is used
203f0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a   for testing of.
20400 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
20410 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a  ite type logic..
20420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20430 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20440 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20450 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20  _AFFINITY ){.   
20460 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20470 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c  *azAff[] = { "bl
20480 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75  ob", "text", "nu
20490 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72  meric", "integer
204a0 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20  ", "real" };.   
204b0 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20       char aff;. 
204c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
204d0 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
204e0 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
204f0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61  ExprAffinity(pFa
20500 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
20510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20520 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
20530 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20  , target, .     
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61           aff ? a
20560 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f  zAff[aff-SQLITE_
20570 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e  AFF_BLOB] : "non
20580 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
20590 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
205a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
205b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
205c0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
205d0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
205e0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
205f0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
20600 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20610 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
20620 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
20630 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
20640 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
20650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20660 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20670 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20680 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
20690 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
206a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
206b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
206c0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
206d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
206e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
206f0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
20700 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
20710 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
20720 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
20730 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
20740 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
20750 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
20760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20770 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
20780 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
20790 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
207a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
207b0 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
207c0 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
207d0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
207e0 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
207f0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
20800 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
20810 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
20820 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
20830 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
20840 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
20850 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
20860 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
20870 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
20880 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
20890 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
208a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
208b0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
208c0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
208d0 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
208e0 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
208f0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
20900 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
20910 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
20920 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20930 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
20940 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
20950 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
20960 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
20970 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
20980 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
20990 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
209a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
209b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
209c0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
209d0 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
209e0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
209f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20a00 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
20a10 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
20a20 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
20a30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20a40 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20a50 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
20a60 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
20a70 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20a80 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
20aa0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
20ab0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20ac0 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
20ad0 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
20ae0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
20af0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20b00 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
20b10 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
20b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
20b50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
20b60 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TOR);.      }els
20b70 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
20b80 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
20b90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
20ba0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
20bb0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
20bc0 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
20bd0 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
20be0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
20bf0 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
20c00 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
20c10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20c20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
20c30 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
20c40 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
20c50 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
20c60 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
20c70 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
20c80 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
20c90 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
20ca0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
20cb0 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
20cc0 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
20cd0 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
20ce0 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
20cf0 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
20d00 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
20d10 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
20d20 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
20d30 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
20d40 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
20d50 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
20d60 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
20d70 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
20d80 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
20d90 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
20da0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
20db0 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
20dc0 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
20dd0 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
20de0 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
20df0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
20e00 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
20e10 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
20e20 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
20e30 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
20e40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20e50 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72  nFarg>=2 && Expr
20e60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20e70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29  r, EP_InfixFunc)
20e80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
20e90 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
20ea0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
20eb0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
20ec0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
20ed0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
20ee0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
20ef0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20f00 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
20f10 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
20f20 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
20f30 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
20f40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20f50 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20f60 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20f70 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
20f80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
20f90 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
20fa0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
20fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20fc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
20fd0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
20fe0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
20ff0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21000 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
21010 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
21020 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
21030 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21050 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21060 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21070 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21080 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
21090 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
210a0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
210b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
210c0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
210d0 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
210e0 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
210f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
21100 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21120 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21130 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21140 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
21150 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
21160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21170 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
21180 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
21190 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
211a0 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
211d0 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
211e0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
211f0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
21200 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21210 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
21220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21230 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
21240 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
21250 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21260 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21270 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
21280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21290 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
212a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
212b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
212c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
212d0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
212e0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
212f0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
21300 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21310 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
21320 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21330 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21340 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
21350 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
21360 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21370 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
21380 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
21390 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
213a0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
213b0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
213c0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
213d0 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
213e0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
213f0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
21400 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
21410 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21420 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
21430 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
21440 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  n;.      if( pEx
21450 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21460 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21470 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21480 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  able = sqlite3Co
21490 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
214a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
214b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
214c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
214d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
214e0 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
214f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
21500 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
21510 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
21520 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
21530 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45  e!=(n = sqlite3E
21540 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
21550 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20  xpr->pLeft)) .  
21560 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
21570 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21580 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
21590 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
215a0 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
215d0 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20  Table, n);.     
215e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
215f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21600 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43  able + pExpr->iC
21610 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  olumn;.    }.   
21620 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21630 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
21640 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
21650 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21660 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21670 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
21680 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
216b0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
216c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
216d0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
216e0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
216f0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
21700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21710 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21720 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
21730 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21740 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21750 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
21760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21780 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
21790 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
217a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
217b0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
217c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
217d0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
217e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
217f0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
21800 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
21810 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
21820 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
21830 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
21840 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
21850 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
21860 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
21870 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
21880 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
21890 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
218a0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
218b0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
218c0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
218d0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
218e0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
218f0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
21900 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21910 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
21920 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
21930 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
21940 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
21950 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
21960 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
21970 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
21980 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
21990 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
219a0 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
219b0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
219c0 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
219d0 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
219e0 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
219f0 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
21a00 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
21a10 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
21a20 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
21a30 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
21a40 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
21a50 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
21a60 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
21a70 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
21a80 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
21a90 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
21aa0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
21ab0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
21ac0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
21ad0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
21ae0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
21af0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
21b00 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
21b10 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
21b20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
21b30 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
21b40 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
21b50 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
21b60 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
21b70 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
21b80 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
21b90 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
21ba0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
21bb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21bc0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
21bd0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
21be0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
21bf0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
21c00 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
21c10 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
21c20 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
21c30 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
21c40 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
21c50 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
21c60 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
21c70 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
21c80 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
21c90 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
21ca0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
21cb0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
21cc0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
21cd0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
21ce0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
21cf0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
21d00 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
21d10 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
21d20 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
21d30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
21d40 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
21d50 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
21d60 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
21d70 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
21d80 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
21d90 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
21da0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
21db0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
21dc0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
21dd0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
21de0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
21df0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
21e00 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
21e10 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
21e20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
21e30 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
21e40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
21e50 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
21e60 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
21e70 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
21e80 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
21e90 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
21ea0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
21eb0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
21ec0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
21ed0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
21ee0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
21ef0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
21f00 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
21f10 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
21f20 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
21f30 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
21f40 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
21f50 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
21f60 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
21f70 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
21f80 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
21f90 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
21fa0 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
21fb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
21fc0 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
21fd0 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
21fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
21ff0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
22000 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
22010 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
22020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
22030 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
22040 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
22050 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
22060 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
22070 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
22080 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
220a0 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
220b0 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
220c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
220d0 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73  (v, "r[%d]=%s.%s
220e0 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  ", target,.     
220f0 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
22100 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
22110 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
22120 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
22130 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
22140 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  >y.pTab->aCol[pE
22150 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
22160 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
22170 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22180 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
22190 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
221a0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
221b0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
221c0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
221d0 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
221e0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
221f0 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
22200 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
22210 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
22220 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
22230 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
22240 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
22250 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
22260 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
22270 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
22280 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
22290 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
222a0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
222b0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
222c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
222d0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
222e0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
222f0 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
22300 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
22310 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
22320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22330 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
22340 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
22350 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
22360 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
22370 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
22380 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
22390 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
223a0 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
223b0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
223c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
223d0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
223e0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20  IF_NULL_ROW: {. 
223f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52       int addrINR
22400 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20  ;.      addrINR 
22410 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
22420 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c  Op1(v, OP_IfNull
22430 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Row, pExpr->iTab
22440 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  le);.      inReg
22450 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22460 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22470 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
22480 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22490 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
224a0 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20  e(v, addrINR);. 
224b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
224c0 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
224d0 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  INR, inReg);.   
224e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
224f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
22500 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
22510 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
22520 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
22530 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
22540 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22550 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22560 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
22570 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
22580 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22590 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
225a0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
225b0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
225c0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
225d0 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
225e0 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
225f0 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
22600 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
22610 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
22620 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22630 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
22640 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
22650 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
22660 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22670 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
22680 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
22690 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
226a0 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
226b0 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
226c0 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
226d0 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
226e0 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
226f0 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
22700 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
22710 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
22720 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
22730 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
22740 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
22750 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
22760 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
22770 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
22780 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
22790 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
227a0 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
227b0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
227c0 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
227d0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
227e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
227f0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
22800 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
22810 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
22820 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
22830 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
22840 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
22850 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
22860 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
22870 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
22880 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
22890 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
228a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
228b0 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
228c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
228d0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
228e0 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
228f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
22900 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
22910 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
22920 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
22930 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
22940 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
22970 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
22980 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
22990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
229c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
229d0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
229e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
229f0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
22a00 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
22a10 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
22a20 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
22a30 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
22a40 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
22a50 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
22a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22a70 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
22a80 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
22a90 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ab0 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
22ac0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
22ad0 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22af0 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
22b00 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
22b10 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
22b20 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
22b30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22b40 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
22b50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
22b60 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
22b70 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
22b80 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
22b90 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
22ba0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
22bb0 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
22bc0 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
22bd0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
22be0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
22bf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
22c00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
22c10 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
22c20 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
22c30 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20          tempX = 
22c40 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
22c50 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
22c60 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
22c70 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
22c80 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43  er(&tempX, exprC
22c90 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
22ca0 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
22cb0 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
22cc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
22cd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
22ce0 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72  memset(&opCompar
22cf0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43  e, 0, sizeof(opC
22d00 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20  ompare));.      
22d10 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
22d20 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
22d30 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
22d40 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
22d50 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
22d60 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
22d70 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
22d80 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
22d90 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
22da0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
22db0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
22dc0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
22dd0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
22de0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
22df0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
22e00 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
22e10 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
22e20 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
22e30 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
22e40 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
22e50 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
22e60 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
22e70 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
22e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
22e90 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
22ea0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
22eb0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
22ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
22ed0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
22ee0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
22ef0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
22f00 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
22f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22f20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
22f30 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
22f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22f50 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
22f60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
22f70 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
22f80 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
22f90 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
22fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22fb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22fc0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
22fd0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
22fe0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
22ff0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23000 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
23010 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23030 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23040 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
23050 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
23060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23070 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
23080 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23090 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
230a0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
230b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
230c0 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
230d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
230e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
230f0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23100 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23110 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
23120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23140 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
23150 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
23160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23170 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23180 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
23190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
231a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
231b0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
231c0 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
231d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
231e0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
231f0 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
23200 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23210 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
23220 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
23230 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23240 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
23250 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
23260 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
23270 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
23280 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
23290 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
232a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
232b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
232e0 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
232f0 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
23300 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
23310 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23330 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
23340 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
23350 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
23360 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
23370 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
23380 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23390 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
233a0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
233b0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
233c0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
233d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
233e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
233f0 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
23400 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
23410 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
23420 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
23430 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
23440 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
23450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23460 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
23470 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
23480 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23490 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
234c0 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
234d0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
234e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
234f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
23500 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
23510 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23520 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
23530 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
23540 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23550 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
23560 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
23570 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
23580 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
23590 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
235a0 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
235b0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  tion time..**.**
235c0 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74   If regDest>=0 t
235d0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
235e0 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
235f0 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
23600 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75   and the.** resu
23610 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62  lt is not reusab
23620 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c  le.  If regDest<
23630 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
23640 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a  ine is free to .
23650 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  ** store the val
23660 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20  ue whereever it 
23670 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  wants.  The regi
23680 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65  ster where the e
23690 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73  xpression .** is
236a0 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72   stored is retur
236b0 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65  ned.  When regDe
236c0 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69  st<0, two identi
236d0 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  cal expressions 
236e0 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  will.** code to 
236f0 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
23700 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
23710 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
23720 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23730 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23740 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
23750 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
23760 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
23770 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
23780 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
23790 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
237a0 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  est       /* Sto
237b0 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
237c0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
237d0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
237e0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
237f0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
23800 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
23810 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
23820 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
23830 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  && p ){.    stru
23840 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
23850 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74   *pItem;.    int
23860 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   i;.    for(pIte
23870 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
23880 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
23890 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  , i--){.      if
238a0 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
238b0 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
238c0 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d  Compare(0,pItem-
238d0 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
238e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
238f0 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69  eturn pItem->u.i
23900 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20  ConstExprReg;.  
23910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23920 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
23930 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
23940 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
23950 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
23960 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
23970 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
23980 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
23990 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
239a0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
239b0 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
239c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
239d0 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30  able = regDest<0
239e0 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65  ;.     if( regDe
239f0 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d  st<0 ) regDest =
23a00 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23a10 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
23a20 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
23a30 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50  egDest;.  }.  pP
23a40 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
23a50 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72   = p;.  return r
23a60 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egDest;.}../*.**
23a70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
23a80 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
23a90 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
23aa0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
23ab0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
23ac0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
23ad0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
23ae0 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
23af0 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
23b00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
23b10 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
23b20 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
23b30 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
23b40 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
23b50 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
23b60 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
23b70 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
23b80 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
23b90 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
23ba0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
23bb0 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
23bc0 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
23bd0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
23be0 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
23bf0 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
23c00 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
23c10 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
23c20 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
23c30 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
23c40 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
23c50 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
23c60 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
23c70 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
23c80 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
23c90 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
23ca0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
23cb0 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
23cc0 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
23cd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
23ce0 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
23cf0 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
23d00 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
23d10 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
23d20 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
23d30 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
23d40 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
23d50 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  xpr).  ){.    *p
23d60 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32  Reg  = 0;.    r2
23d70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
23d80 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
23d90 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d   pExpr, -1);.  }
23da0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
23db0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
23dc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
23dd0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
23de0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
23df0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
23e00 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
23e10 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
23e20 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
23e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
23e40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23e50 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
23e60 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
23e70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
23e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
23e90 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
23ea0 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
23eb0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
23ec0 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
23ed0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
23ee0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
23ef0 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
23f00 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
23f10 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
23f20 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
23f30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
23f40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
23f50 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
23f60 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
23f70 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
23f80 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
23f90 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
23fa0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
23fb0 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
23fc0 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
23fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23fe0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
23ff0 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
24000 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
24010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24020 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
24030 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
24040 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24050 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
24060 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
24070 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
24080 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24090 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
240a0 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
240b0 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
240c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
240d0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
240e0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
240f0 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
24100 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
24110 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
24120 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
24130 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
24140 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
24150 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
24160 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
24170 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
24180 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
24190 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
241a0 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
241b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
241c0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
241d0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
241e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
241f0 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
24200 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24210 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24220 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24230 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
24240 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
24250 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
24260 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
24270 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
24280 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24290 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
242a0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
242b0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
242c0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
242d0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
242e0 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
242f0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
24300 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
24310 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
24320 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
24330 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
24340 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
24350 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
24360 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
24370 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
24380 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
24390 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
243a0 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
243b0 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
243c0 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
243d0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
243e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
243f0 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
24400 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24410 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24420 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
24430 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
24440 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
24450 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
24460 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
24470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24480 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24490 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
244a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
244b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
244c0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
244d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
244e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
244f0 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
24500 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
24510 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
24520 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
24530 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
24540 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
24550 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
24560 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
24570 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
24580 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
24590 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
245a0 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
245b0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
245c0 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
245d0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
245e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
245f0 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
24600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24610 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
24620 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
24630 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
24640 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
24650 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
24660 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
24670 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
24680 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
24690 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
246a0 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
246b0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
246c0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
246d0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
246e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
246f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
24700 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
24710 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
24720 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
24730 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
24740 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24750 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24760 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
24770 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24780 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
24790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
247a0 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
247b0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
247c0 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
247d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
247e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
247f0 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
24800 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
24810 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
24820 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
24830 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
24840 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
24850 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
24860 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
24870 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
24880 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20  ents evaluated. 
24890 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
248a0 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75  rned will.** usu
248b0 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e  ally be pList->n
248c0 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62  Expr but might b
248d0 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c  e reduced if SQL
248e0 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
248f0 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  .** is defined..
24900 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
24910 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
24920 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
24930 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
24940 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
24950 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
24960 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
24970 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
24980 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
24990 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
249a0 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
249b0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
249c0 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
249d0 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
249e0 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
249f0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
24a00 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
24a10 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
24a20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
24a30 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
24a40 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
24a50 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
24a60 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
24a70 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
24a80 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
24a90 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
24aa0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
24ab0 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
24ac0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45  ** If SQLITE_ECE
24ad0 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73  L_OMITREF is als
24ae0 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  o set, then the 
24af0 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e  values with u.x.
24b00 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a  iOrderByCol>0.**
24b10 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74   are simply omit
24b20 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
24b30 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f  being copied fro
24b40 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74  m srcReg..*/.int
24b50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b60 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
24b70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
24b80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24b90 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
24ba0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
24bb0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
24bc0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
24bd0 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
24be0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
24bf0 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
24c00 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
24c10 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
24c20 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
24c30 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
24c40 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
24c50 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
24c60 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
24c70 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
24c80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24c90 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
24ca0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
24cb0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
24cc0 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
24cd0 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
24ce0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24cf0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
24d00 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
24d10 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24d20 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
24d30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
24d40 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
24d50 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
24d60 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
24d70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
24d80 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
24d90 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
24da0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
24db0 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
24dc0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
24dd0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
24de0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
24df0 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
24e00 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20  ->pExpr;.#ifdef 
24e10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
24e20 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
24e30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62      if( pItem->b
24e40 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
24e50 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d     i--;.      n-
24e60 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  -;.    }else.#en
24e70 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61  dif.    if( (fla
24e80 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
24e90 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
24ea0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
24eb0 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
24ec0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
24ed0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
24ee0 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
24ef0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
24f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24f20 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
24f30 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
24f40 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
24f50 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
24f60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24f70 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 0a  ECEL_FACTOR)!=0.
24f80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
24f90 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24fa0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24fb0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
24fc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24fd0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24fe0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
24ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25000 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
25010 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25020 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25030 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
25040 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
25050 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
25060 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
25070 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
25080 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25090 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
250a0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
250b0 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
250c0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
250d0 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
250e0 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
250f0 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
25100 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
25110 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
25120 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
25130 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25140 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25160 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
25170 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25180 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25190 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
251a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
251b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
251c0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
251d0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
251e0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
251f0 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
25200 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
25210 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
25220 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
25230 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
25240 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
25250 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
25260 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
25270 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
25280 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
25290 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
252a0 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
252b0 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
252d0 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
252e0 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
252f0 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
25300 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
25310 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
25320 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
25330 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
25340 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
25350 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
25360 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
25370 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
25380 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
25390 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
253a0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
253b0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
253c0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
253d0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
253e0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
253f0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
25400 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
25410 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
25420 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
25430 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
25440 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
25450 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
25460 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
25470 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
25480 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
25490 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
254a0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
254b0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
254c0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
254d0 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
254e0 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e  .){. Expr exprAn
254f0 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
25500 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
25510 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
25520 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
25530 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
25540 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
25550 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
25560 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
25570 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
25580 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
25590 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
255a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
255b0 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
255c0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
255d0 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74  er */...  memset
255e0 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
255f0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
25600 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
25610 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
25620 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
25630 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
25640 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
25650 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
25660 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25670 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
25680 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
25690 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
256a0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
256b0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
256c0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
256d0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
256e0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
256f0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
25700 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
25710 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
25720 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
25730 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
25740 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
25750 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
25760 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
25770 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
25780 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
25790 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
257a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
257b0 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
257c0 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f  r(&exprX, exprCo
257d0 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
257e0 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
257f0 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d  e1));.  if( xJum
25800 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70  p ){.    xJump(p
25810 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
25820 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
25830 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
25840 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70   /* Mark the exp
25850 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67  ression is being
25860 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
25870 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
25880 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  a join.    ** so
25890 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
258a0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
258b0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  ) routine will n
258c0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f  ot attempt to mo
258d0 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  ve.    ** it int
258e0 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e  o the Parse.pCon
258f0 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65  stExpr list.  We
25900 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65   should use a ne
25910 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a  w bit for this,.
25920 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69      ** for clari
25930 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f  ty, but we are o
25940 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ut of bits in th
25950 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  e Expr.flags fie
25960 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20  ld so we.    ** 
25970 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68  have to reuse th
25980 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69  e EP_FromJoin bi
25990 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20  t.  Bummer. */. 
259a0 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c     exprX.flags |
259b0 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
259c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
259d0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
259e0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29   &exprAnd, dest)
259f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
25a00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
25a10 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
25a20 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
25a30 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
25a40 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
25a50 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25a60 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
25a70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
25a80 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
25a90 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25aa0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25ab0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
25ac0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
25ad0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
25ae0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25af0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
25b00 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
25b10 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
25b20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25b30 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25b40 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
25b50 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
25b60 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
25b70 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25b80 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25b90 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
25ba0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
25bb0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25bc0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25bd0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
25be0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25bf0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
25c00 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25c10 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
25c20 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
25c30 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
25c40 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
25c50 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25c60 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
25c70 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
25c80 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
25c90 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25ca0 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p==0 );.}../*.**
25cb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
25cc0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
25cd0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
25ce0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
25cf0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
25d00 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
25d10 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
25d20 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
25d30 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
25d40 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
25d50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25d60 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
25d70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
25d80 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
25d90 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
25da0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
25db0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
25dc0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
25dd0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
25de0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
25df0 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
25e00 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
25e10 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
25e20 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
25e30 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
25e40 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
25e50 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
25e60 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
25e70 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
25e80 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
25e90 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
25ea0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
25eb0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
25ec0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
25ed0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
25ee0 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
25ef0 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
25f00 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
25f10 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
25f20 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
25f30 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
25f40 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
25f50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25f60 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
25f70 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
25f80 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
25f90 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
25fa0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
25fb0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
25fc0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
25fd0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
25fe0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
25ff0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
26000 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
26010 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
26020 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
26030 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
26040 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
26050 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
26060 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
26070 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
26080 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
26090 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
260a0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
260b0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
260c0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
260d0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
260e0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
260f0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
26100 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
26110 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26120 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26130 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26140 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26150 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
26160 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26170 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
26180 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
26190 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
261a0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
261b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
261c0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
261d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
261e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
261f0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
26200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26210 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
26220 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26230 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26250 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26260 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26270 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26280 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26290 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
262a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
262b0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
262c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
262d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
262e0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
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 65 73 74  xpr->pLeft, dest
26340 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26360 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
26370 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
26380 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20   isNot;      /* 
26390 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
263a0 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
263b0 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
263c0 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
263d0 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
263e0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
263f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26400 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
26410 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
26420 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54  ISNOT;.      isT
26430 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
26440 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
26450 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
26460 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
26470 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
26480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
26490 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
264a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  );.      if( isT
264b0 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20  rue ^ isNot ){. 
264c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
264d0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
264e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
264f0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26510 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
26520 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
26530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26550 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26560 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26570 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
26590 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d  Not ? SQLITE_JUM
265a0 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20  PIFNULL : 0);.  
265b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
265c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
265d0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
265e0 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
265f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26600 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
26610 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
26620 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
26630 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
26640 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
26650 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
26660 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
26670 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
26680 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
26690 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
266a0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
266b0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
266c0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
266d0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
266e0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
266f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
26700 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
26710 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
26720 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
26730 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26740 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26750 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26760 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26770 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26780 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26790 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
267a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
267b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
267c0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
267d0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
267e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
267f0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
26800 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
26820 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
26830 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
26840 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
26850 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
26860 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
26870 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26880 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
26890 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
268a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
268b0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
268c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
268d0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
268e0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
268f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26900 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
26910 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
26920 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26930 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
26940 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
26950 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26960 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
26970 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26980 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
26990 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
269a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
269b0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
269c0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
269d0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
269e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
269f0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
26a00 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
26a10 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
26a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26a30 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
26a40 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
26a50 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
26a60 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26a70 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
26a80 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26a90 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26aa0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26ab0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26ac0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26ad0 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
26ae0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26af0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
26b00 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
26b10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26b20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26b30 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
26b40 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
26b50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26b60 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
26b70 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
26b80 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
26b90 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
26ba0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
26bb0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
26bc0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
26bd0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
26be0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26bf0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26c00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26c10 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26c30 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
26c40 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
26c50 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26c60 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
26c70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26c80 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
26c90 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
26ca0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
26cb0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26cc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26cd0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
26ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26cf0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26d00 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
26d10 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
26d20 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
26d30 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d  3ExprIfTrue, jum
26d40 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
26d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26d70 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
26d80 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
26d90 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
26da0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
26db0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26dc0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
26dd0 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
26de0 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
26df0 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
26e00 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
26e10 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
26e20 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
26e30 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
26e40 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
26e50 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
26e60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26e70 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
26e80 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
26e90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26ea0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
26eb0 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a    default_expr:.
26ec0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
26ed0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
26ee0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26ef0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
26f00 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
26f10 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
26f20 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
26f30 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
26f40 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
26f50 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
26f60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26f70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
26f80 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
26f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26fa0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
26fb0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
26fc0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
26fd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
26fe0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
26ff0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27000 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
27010 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27020 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
27030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27040 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27050 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27060 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
27070 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27080 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27090 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
270a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
270b0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
270c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
270d0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
270e0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
270f0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
27100 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27110 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
27120 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
27130 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
27140 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
27150 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
27160 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
27170 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
27180 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
27190 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
271a0 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
271b0 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
271c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
271d0 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
271e0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
271f0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
27200 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27210 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
27220 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
27230 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
27240 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
27250 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
27260 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
27270 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
27280 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
27290 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
272a0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
272b0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
272c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
272d0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
272e0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
272f0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
27300 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
27310 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
27320 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
27330 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
27340 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
27350 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
27360 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
27370 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
27380 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
27390 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
273a0 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
273b0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
273c0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
273d0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
273e0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
273f0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
27400 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
27410 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
27420 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
27430 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
27440 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
27450 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
27460 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
27470 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
27480 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
27490 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
274a0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
274b0 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
274c0 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
274d0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
274e0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
274f0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
27500 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
27510 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
27520 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
27530 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
27540 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
27550 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27560 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
27570 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
27580 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
27590 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
275a0 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
275b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
275c0 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
275d0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
275e0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
275f0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
27600 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
27610 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
27620 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
27630 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
27640 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
27650 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
27660 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
27670 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
27680 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
27690 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
276a0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
276b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
276c0 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
276d0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
276e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
276f0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
27700 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
27710 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
27720 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
27730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27740 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
27750 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
27760 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27770 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
27780 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
27790 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
277a0 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
277b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
277c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
277d0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
277e0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
277f0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
27800 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
27810 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27820 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27830 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27840 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27850 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27860 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27870 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27880 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27890 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
278a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
278b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
278c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
278d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
278e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
278f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27900 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27910 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27930 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
27940 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
27950 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
27960 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
27970 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27980 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
27990 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
279a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
279b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
279c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
279d0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
279e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
279f0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
27a00 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27a10 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27a20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27a30 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27a40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27a50 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27a70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
27a80 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
27a90 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20   isNot;   /* IS 
27aa0 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
27ab0 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
27ac0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f    int isTrue;  /
27ad0 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
27ae0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
27af0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27b00 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27b10 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
27b20 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
27b30 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
27b40 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
27b50 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
27b60 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
27b70 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
27b80 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
27b90 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
27ba0 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
27bb0 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
27bc0 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
27bd0 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20   /* IS TRUE and 
27be0 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
27bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27c00 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
27c10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27c20 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
27c50 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27c60 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
27c70 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41          /* IS FA
27c80 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54  LSE and IS NOT T
27c90 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  RUE */.        s
27ca0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
27cb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27cc0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
27cf0 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
27d00 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
27d10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27d20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
27d30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
27d40 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
27d50 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
27d60 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
27d70 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
27d80 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
27d90 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
27da0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
27db0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
27dc0 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
27dd0 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
27de0 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
27df0 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
27e00 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
27e10 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
27e20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
27e30 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
27e40 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
27e50 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
27e60 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
27e70 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
27e80 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
27e90 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
27ea0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27eb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27ec0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
27ed0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27ee0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27ef0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27f00 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
27f10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
27f20 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
27f30 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
27f40 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
27f50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27f60 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
27f70 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
27f80 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
27f90 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
27fa0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
27fb0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
27fc0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27fd0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
27fe0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
27ff0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28000 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
28010 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28020 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
28030 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
28040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28050 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
28060 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
28070 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
28080 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
28090 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
280a0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
280b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
280c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
280d0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
280e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
280f0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
28100 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
28110 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
28120 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
28130 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
28140 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
28150 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28160 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28170 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  q && jumpIfNull=
28180 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
281a0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
281b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
281c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
281d0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
281e0 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
281f0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
28200 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28210 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28220 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28230 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
28240 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
28250 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28270 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
28280 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28290 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
282a0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
282b0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
282c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
282d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
282e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
282f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28310 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
28320 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
28330 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
28340 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
28350 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
28360 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
28370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28380 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
28390 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
283a0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
283b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
283c0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
283d0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
283e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
283f0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
28400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28410 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28420 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
28430 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
28440 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
28450 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a  e3ExprIfFalse, j
28460 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
28470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28490 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
284a0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
284b0 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
284c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
284d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
284e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
284f0 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
28500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28510 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
28520 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28530 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
28540 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28550 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
28560 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
28570 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
28580 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28590 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
285a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
285b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
285c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
285d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
285e0 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20  ult_expr: .     
285f0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
28600 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
28610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28620 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
28630 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28640 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
28650 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28660 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
28670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28680 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
28690 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
286a0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
286b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
286c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
286d0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
286e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
286f0 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
28700 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28710 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28720 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
28730 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28740 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28750 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
28760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28770 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
28780 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
28790 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
287a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
287b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
287c0 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
287d0 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
287e0 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63  xprIfFalse() exc
287f0 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20  ept that a copy 
28800 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72  is made of pExpr
28810 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20   before.** code 
28820 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20  generation, and 
28830 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c  that copy is del
28840 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20  eted after code 
28850 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73  generation. This
28860 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74  .** ensures that
28870 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45   the original pE
28880 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64  xpr is unchanged
28890 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
288a0 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
288b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
288c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
288d0 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e  dest,int jumpIfN
288e0 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ull){.  sqlite3 
288f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
28900 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20  ;.  Expr *pCopy 
28910 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
28920 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
28930 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
28940 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
28950 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28960 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70  lse(pParse, pCop
28970 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  y, dest, jumpIfN
28980 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
28990 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
289a0 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a  , pCopy);.}../*.
289b0 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56  ** Expression pV
289c0 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ar is guaranteed
289d0 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61   to be an SQL va
289e0 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61  riable. pExpr ma
289f0 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65  y be any.** type
28a00 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   of expression..
28a10 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
28a20 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76  s a simple SQL v
28a30 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65  alue - an intege
28a40 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c  r, real, string,
28a50 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c   blob.** or NULL
28a60 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68   value - then th
28a70 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79  e VDBE currently
28a80 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20   being prepared 
28a90 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
28aa0 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65   to re-prepare e
28ab0 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76  ach time a new v
28ac0 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f  alue is bound to
28ad0 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a   variable pVar..
28ae0 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  **.** Additional
28af0 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  ly, if pExpr is 
28b00 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
28b10 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ue and the value
28b20 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
28b30 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  as that currentl
28b40 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  y bound to varia
28b50 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65  ble pVar, non-ze
28b60 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
28b70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
28b80 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
28b90 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20  not the same or 
28ba0 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  if pExpr is not 
28bb0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20  a simple.** SQL 
28bc0 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72  value, zero is r
28bd0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
28be0 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61  ic int exprCompa
28bf0 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65  reVariable(Parse
28c00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
28c10 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70  pVar, Expr *pExp
28c20 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  r){.  int res = 
28c30 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20  0;.  int iVar;. 
28c40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
28c50 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a  pL, *pR = 0;.  .
28c60 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
28c70 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  omExpr(pParse->d
28c80 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45  b, pExpr, SQLITE
28c90 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46  _UTF8, SQLITE_AF
28ca0 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20  F_BLOB, &pR);.  
28cb0 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56  if( pR ){.    iV
28cc0 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75  ar = pVar->iColu
28cd0 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
28ce0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
28cf0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
28d00 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c  r);.    pL = sql
28d10 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
28d20 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
28d30 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
28d40 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29  SQLITE_AFF_BLOB)
28d50 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a  ;.    if( pL ){.
28d60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28d70 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29  3_value_type(pL)
28d80 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
28d90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28da0 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b  _value_text(pL);
28db0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
28dc0 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54  e encoding is UT
28dd0 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  F-8 */.      }. 
28de0 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73       res =  0==s
28df0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
28e00 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20  (pL, pR, 0);.   
28e10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
28e20 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20  lueFree(pR);.   
28e30 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
28e40 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  e(pL);.  }..  re
28e50 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
28e60 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
28e70 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
28e80 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
28e90 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
28ea0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
28eb0 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
28ec0 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
28ed0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
28ee0 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
28ef0 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
28f00 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
28f10 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
28f20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
28f30 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
28f40 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
28f50 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
28f60 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
28f70 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
28f80 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
28f90 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
28fa0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
28fb0 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
28fc0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
28fd0 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
28fe0 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
28ff0 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
29000 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
29010 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
29020 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
29030 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
29040 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
29050 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
29060 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
29070 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
29080 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
29090 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
290a0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
290b0 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
290c0 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
290d0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
290e0 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
290f0 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
29100 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
29110 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29120 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
29130 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
29140 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
29150 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
29160 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
29170 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
29180 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
29190 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
291a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
291b0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
291c0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
291d0 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
291e0 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
291f0 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
29200 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
29210 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
29220 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
29230 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
29240 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
29250 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
29260 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
29270 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
29280 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
29290 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
292a0 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
292b0 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
292c0 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
292d0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
292e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  n..**.** If pPar
292f0 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  se is not NULL t
29300 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20  hen TK_VARIABLE 
29310 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68  terms in pA with
29320 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20   bindings in.** 
29330 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
29340 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  re can be matche
29350 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61  d against litera
29360 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a  ls in pB.  The .
29370 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ** pParse->pVdbe
29380 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73  ->expmask bitmas
29390 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72  k is updated for
293a0 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72   each variable r
293b0 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66  eferenced..** If
293c0 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20   pParse is NULL 
293d0 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65  (the normal case
293e0 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41  ) then any TK_VA
293f0 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a  RIABLE term in .
29400 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72  ** Argument pPar
29410 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  se should normal
29420 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ly be NULL. If i
29430 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  t is not NULL an
29440 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61  d pA or.** pB ca
29450 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61  uses a return va
29460 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74  lue of 2..*/.int
29470 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29480 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  are(Parse *pPars
29490 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70  e, Expr *pA, Exp
294a0 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
294b0 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
294c0 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
294d0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
294e0 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
294f0 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
29500 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41  if( pParse && pA
29510 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
29520 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65  E && exprCompare
29530 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c  Variable(pParse,
29540 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20   pA, pB) ){.    
29550 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29560 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
29570 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
29580 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
29590 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
295a0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
295b0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
295c0 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
295d0 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
295e0 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
295f0 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
29600 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
29610 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29620 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
29630 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66  pB->op ){.    if
29640 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
29650 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29660 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29670 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c  e, pA->pLeft,pB,
29680 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
29690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
296a0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
296b0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
296c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
296d0 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d  e(pParse, pA,pB-
296e0 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29  >pLeft,iTab)<2 )
296f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
29700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
29710 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
29720 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
29730 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  N && pA->op!=TK_
29740 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  AGG_COLUMN && pA
29750 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
29760 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
29770 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
29780 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
29790 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  rICmp(pA->u.zTok
297a0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
297b0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
297c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
297d0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
297e0 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
297f0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 73  ation for the as
29800 73 65 72 74 28 29 3a 0a 20 20 20 20 20 20 2a 2a  sert():.      **
29810 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
29820 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b  s have p->op==TK
29830 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61 67  _FUNCTION but ag
29840 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
29850 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20  s.      ** have 
29860 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  p->op==TK_AGG_FU
29870 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20  NCTION.  So any 
29880 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
29890 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  en an aggregate.
298a0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
298b0 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66  n and a window f
298c0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68  unction should h
298d0 61 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72  ave failed befor
298e0 65 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 20  e reaching.     
298f0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   ** this point. 
29900 20 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74 20   And, it is not 
29910 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
29920 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
29930 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  on and.      ** 
29940 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  a scalar functio
29950 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
29960 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  name and number 
29970 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53  of arguments.  S
29980 6f 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 77 65  o.      ** if we
29990 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
299a0 74 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64 20  t, either A and 
299b0 42 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66 75  B both window fu
299c0 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20 20  nctions or.     
299d0 20 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20   ** neither are 
299e0 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
299f0 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ns. */.      ass
29a00 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
29a10 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
29a20 6e 63 29 3d 3d 45 78 70 72 48 61 73 50 72 6f 70  nc)==ExprHasProp
29a30 65 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75  erty(pB,EP_WinFu
29a40 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nc) );.      if(
29a50 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
29a60 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20  (pA,EP_WinFunc) 
29a70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
29a80 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70  qlite3WindowComp
29a90 61 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e 79  are(pParse,pA->y
29aa0 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e 70 57 69 6e  .pWin,pB->y.pWin
29ab0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
29ac0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
29ad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
29ae0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
29af0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
29b00 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41  lite3_stricmp(pA
29b10 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
29b20 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
29b30 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
29b40 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
29b50 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
29b60 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
29b70 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
29b80 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
29b90 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
29ba0 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
29bb0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
29bc0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
29bd0 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
29be0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29bf0 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29  TokenOnly)==0) )
29c00 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
29c10 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
29c20 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
29c30 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d 62  2;.    if( (comb
29c40 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 46  inedFlags & EP_F
29c50 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20  ixedCol)==0.    
29c60 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
29c70 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
29c80 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
29c90 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
29ca0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
29cb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29cc0 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52  e(pParse, pA->pR
29cd0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
29ce0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
29cf0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
29d00 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
29d10 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
29d20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
29d30 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
29d40 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54     if( pA->op!=T
29d50 4b 5f 53 54 52 49 4e 47 0a 20 20 20 20 20 26 26  K_STRING.     &&
29d60 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45   pA->op!=TK_TRUE
29d70 46 41 4c 53 45 0a 20 20 20 20 20 26 26 20 28 63  FALSE.     && (c
29d80 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
29d90 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 0a 20 20  P_Reduced)==0.  
29da0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
29db0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
29dc0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
29dd0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
29de0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
29df0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
29e00 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
29e10 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
29e20 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
29e30 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
29e40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
29e50 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
29e60 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
29e70 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
29e80 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
29e90 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
29ea0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
29eb0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
29ec0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
29ed0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
29ee0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
29ef0 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
29f00 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
29f10 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
29f20 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
29f30 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
29f40 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
29f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29f60 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
29f70 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
29f80 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
29f90 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
29fa0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
29fb0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
29fc0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
29fd0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
29fe0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
29ff0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
2a000 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
2a010 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
2a020 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
2a030 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
2a040 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
2a050 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
2a060 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
2a070 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
2a080 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
2a090 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
2a0a0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
2a0b0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2a0c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2a0d0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
2a0e0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
2a0f0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2a100 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
2a110 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
2a120 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
2a130 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
2a140 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
2a150 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
2a160 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
2a170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
2a180 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2a190 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
2a1a0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
2a1b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2a1c0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
2a1d0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
2a1e0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
2a1f0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
2a200 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
2a210 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a220 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
2a230 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
2a240 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
2a250 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2a260 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
2a270 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a280 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45  ) except COLLATE
2a290 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68   operators at th
2a2a0 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61  e top-level.** a
2a2b0 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  re ignored..*/.i
2a2c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2a2d0 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a  mpareSkip(Expr *
2a2e0 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
2a2f0 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72  t iTab){.  retur
2a300 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  n sqlite3ExprCom
2a310 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20  pare(0,.        
2a320 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a330 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c  SkipCollate(pA),
2a340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2a350 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2a360 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20  late(pB),.      
2a370 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a         iTab);.}.
2a380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2a390 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
2a3a0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
2a3b0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
2a3c0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
2a3d0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2a3e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
2a3f0 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
2a400 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
2a410 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
2a420 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
2a430 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
2a440 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
2a450 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
2a460 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2a470 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
2a480 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2a490 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
2a4a0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
2a4b0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
2a4c0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
2a4d0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
2a4e0 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
2a4f0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
2a500 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
2a510 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2a520 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
2a530 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2a540 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2a550 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
2a560 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
2a570 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2a580 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2a590 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
2a5a0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2a5b0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
2a5c0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
2a5d0 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
2a5e0 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
2a5f0 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
2a600 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
2a610 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
2a620 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
2a630 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
2a640 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  ab..**.** If pPa
2a650 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  rse is not NULL,
2a660 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
2a670 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
2a680 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a  les in pE1 are .
2a690 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  ** compared agai
2a6a0 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  nst literal valu
2a6b0 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50  es in pE2 and pP
2a6c0 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2a6d0 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66  mask is.** modif
2a6e0 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68  ied to record wh
2a6f0 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62  ich bound variab
2a700 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63  les are referenc
2a710 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a  ed.  If pParse .
2a720 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ** is NULL, then
2a730 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72   false will be r
2a740 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63  eturned if pE1 c
2a750 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e  ontains any boun
2a760 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  d variables..**.
2a770 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
2a780 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
2a790 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
2a7a0 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
2a7b0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
2a7c0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
2a7d0 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
2a7e0 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
2a7f0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
2a800 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
2a810 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
2a820 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
2a830 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
2a840 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
2a850 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2a860 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2a870 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
2a880 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
2a890 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
2a8a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a8b0 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20  arse, pE1, pE2, 
2a8c0 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
2a8d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a8e0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2a8f0 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
2a900 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2a910 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2a920 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2a940 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2a950 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
2a960 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
2a970 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
2a980 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2a990 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2a9a0 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31  K_NOTNULL && pE1
2a9b0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
2a9c0 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  && pE1->op!=TK_I
2a9d0 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  S ){.    Expr *p
2a9e0 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  X = sqlite3ExprS
2a9f0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e  kipCollate(pE1->
2aa00 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74  pLeft);.    test
2aa10 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70  case( pX!=pE1->p
2aa20 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Left );.    if( 
2aa30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2aa40 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70  re(pParse, pX, p
2aa50 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
2aa60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2aa70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2aa80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2aa90 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63   the Expr node c
2aaa0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
2aab0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f  te3ExprImpliesNo
2aac0 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49  tNullRow()..** I
2aad0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2aae0 20 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74   node requires t
2aaf0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74  hat the table at
2ab00 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a   pWalker->iCur.*
2ab10 2a 20 68 61 76 65 20 6f 6e 65 20 6f 72 20 6d 6f  * have one or mo
2ab20 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75  re non-NULL colu
2ab30 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61  mn, then set pWa
2ab40 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31  lker->eCode to 1
2ab50 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a   and abort..**.*
2ab60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2ab70 6f 6e 74 72 6f 6c 73 20 61 6e 20 6f 70 74 69 6d  ontrols an optim
2ab80 69 7a 61 74 69 6f 6e 2e 20 20 46 61 6c 73 65 20  ization.  False 
2ab90 70 6f 73 69 74 69 76 65 73 20 28 73 65 74 74 69  positives (setti
2aba0 6e 67 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65  ng.** pWalker->e
2abb0 43 6f 64 65 20 74 6f 20 31 20 77 68 65 6e 20 69  Code to 1 when i
2abc0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 29  t should not be)
2abd0 20 61 72 65 20 64 65 61 64 6c 79 2c 20 62 75 74   are deadly, but
2abe0 20 66 61 6c 73 65 2d 6e 65 67 61 74 69 76 65 73   false-negatives
2abf0 0a 2a 2a 20 28 6e 65 76 65 72 20 73 65 74 74 69  .** (never setti
2ac00 6e 67 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  ng pWalker->eCod
2ac10 65 29 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  e) is a harmless
2ac20 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2ac30 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2ac40 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75  int impliesNotNu
2ac50 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57  llRow(Walker *pW
2ac60 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2ac70 70 72 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  pr){.  testcase(
2ac80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2ac90 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74  GG_COLUMN );.  t
2aca0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2acb0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2acc0 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ION );.  if( Exp
2acd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2ace0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2acf0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72   ) return WRC_Pr
2ad00 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  une;.  switch( p
2ad10 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2ad20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
2ad30 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a     case TK_NOT:.
2ad40 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
2ad50 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2ad60 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
2ad70 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
2ad80 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54  CASE:.    case T
2ad90 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IN:.    case T
2ada0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
2adb0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2adc0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
2add0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ade0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2adf0 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _NOT );.      te
2ae00 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ae10 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
2ae20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ae30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2ae40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ae50 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ae60 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  K_OR );.      te
2ae70 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ae80 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20  p==TK_CASE );.  
2ae90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2aea0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
2aeb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2aec0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2aed0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
2aee0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2aef0 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ne;.    case TK_
2af00 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66  COLUMN:.      if
2af10 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75  ( pWalker->u.iCu
2af20 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
2af30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c   ){.        pWal
2af40 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2af50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2af60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2af70 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2af80 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f  RC_Prune;..    /
2af90 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * Virtual tables
2afa0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
2afb0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
2afc0 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f  like x=NULL.  So
2afd0 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f  .    ** a term o
2afe0 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64  f the form x=y d
2aff0 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68  oes not prove th
2b000 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  at y is not null
2b010 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20   if x.    ** is 
2b020 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  the column of a 
2b030 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
2b040 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
2b050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
2b060 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
2b070 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
2b080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
2b090 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
2b0a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b0b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2b0c0 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
2b0d0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b0e0 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
2b0f0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b100 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
2b110 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b120 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  pr->op==TK_LE );
2b130 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b140 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2b150 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b160 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b170 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69  TK_GE );.      i
2b180 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  f( (pExpr->pLeft
2b190 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2b1a0 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78  && IsVirtual(pEx
2b1b0 70 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54 61  pr->pLeft->y.pTa
2b1c0 62 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  b)).       || (p
2b1d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  Expr->pRight->op
2b1e0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49  ==TK_COLUMN && I
2b1f0 73 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e  sVirtual(pExpr->
2b200 70 52 69 67 68 74 2d 3e 79 2e 70 54 61 62 29 29  pRight->y.pTab))
2b210 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2b220 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b230 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  e;.      }.    d
2b240 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
2b250 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b260 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
2b270 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
2b280 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65 73  -zero) if expres
2b290 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20  sion p can only 
2b2a0 62 65 20 74 72 75 65 20 69 66 20 61 74 20 6c 65  be true if at le
2b2b0 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d  ast.** one colum
2b2c0 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62 20  n of table iTab 
2b2d0 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e  is non-null.  In
2b2e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2b2f0 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
2b300 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c  expression p wil
2b310 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c  l always be NULL
2b320 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76 65   or false if eve
2b330 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61  ry column of iTa
2b340 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  b.** is NULL..**
2b350 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74 69  .** False negati
2b360 76 65 73 20 61 72 65 20 61 63 63 65 70 74 61 62  ves are acceptab
2b370 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
2b380 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f  rds, it is ok to
2b390 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20   return.** zero 
2b3a0 65 76 65 6e 20 69 66 20 65 78 70 72 65 73 73 69  even if expressi
2b3b0 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72 20  on p will never 
2b3c0 62 65 20 74 72 75 65 20 6f 66 20 65 76 65 72 79  be true of every
2b3d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a   column of iTab.
2b3e0 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66  ** is NULL.  A f
2b3f0 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69 73  alse negative is
2b400 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65 64   merely a missed
2b410 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70   optimization op
2b420 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a  portunity..**.**
2b430 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73   False positives
2b440 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
2b450 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66 61  , however.  A fa
2b460 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61 79  lse positive may
2b470 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
2b480 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
2b490 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  r..**.** Terms o
2b4a0 66 20 70 20 74 68 61 74 20 61 72 65 20 6d 61 72  f p that are mar
2b4b0 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d  ked with EP_From
2b4c0 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65 20  Join (and hence 
2b4d0 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a  that come from.*
2b4e0 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
2b4f0 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45 46  G clauses of LEF
2b500 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78 63  T JOINS) are exc
2b510 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 61  luded from the a
2b520 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  nalysis..**.** T
2b530 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2b540 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
2b550 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  a LEFT JOIN can 
2b560 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2b570 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  o.** an ordinary
2b580 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61 72   JOIN.  The p ar
2b590 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57 48  gument is the WH
2b5a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20  ERE clause.  If 
2b5b0 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  the WHERE.** cla
2b5c0 75 73 65 20 72 65 71 75 69 72 65 73 20 74 68 61  use requires tha
2b5d0 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66  t some column of
2b5e0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2b5f0 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   of the LEFT JOI
2b600 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  N.** be non-NULL
2b610 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54 20  , then the LEFT 
2b620 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66 65  JOIN can be safe
2b630 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  ly converted int
2b640 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
2b650 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   join..*/.int sq
2b660 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2b670 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20  NonNullRow(Expr 
2b680 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  *p, int iTab){. 
2b690 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
2b6a0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69  ExprCallback = i
2b6b0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b6c0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2b6d0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78  lback = 0;.  w.x
2b6e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2b6f0 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  = 0;.  w.eCode =
2b700 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d   0;.  w.u.iCur =
2b710 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33   iTab;.  sqlite3
2b720 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
2b730 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
2b740 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  e;.}../*.** An i
2b750 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2b760 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2b770 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2b780 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2b790 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2b7a0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
2b7b0 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
2b7c0 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
2b7d0 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
2b7e0 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
2b7f0 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
2b800 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2b810 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
2b820 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
2b830 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
2b840 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
2b850 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
2b860 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
2b870 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
2b880 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2b890 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
2b8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2b8b0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
2b8c0 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
2b8d0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2b8e0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2b8f0 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
2b900 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2b910 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
2b920 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
2b930 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
2b940 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
2b950 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
2b960 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
2b970 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2b980 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
2b990 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
2b9a0 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
2b9b0 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
2b9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2b9d0 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
2b9e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2b9f0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2ba00 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2ba10 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
2ba20 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
2ba30 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2ba40 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
2ba50 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2ba60 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
2ba70 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
2ba80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
2ba90 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
2baa0 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2bab0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2bac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2bad0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2bae0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2baf0 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
2bb00 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
2bb10 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
2bb20 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
2bb30 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2bb40 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2bb50 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
2bb60 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
2bb70 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
2bb80 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
2bb90 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
2bba0 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
2bbb0 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
2bbc0 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
2bbd0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
2bbe0 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
2bbf0 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
2bc00 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
2bc10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
2bc20 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
2bc30 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
2bc40 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
2bc50 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
2bc60 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
2bc70 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
2bc80 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
2bc90 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
2bca0 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
2bcb0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
2bcc0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2bcd0 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
2bce0 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
2bcf0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
2bd00 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
2bd10 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2bd20 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2bd30 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
2bd40 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
2bd50 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
2bd60 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
2bd70 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2bd80 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
2bd90 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2bda0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
2bdb0 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
2bdc0 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
2bdd0 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
2bde0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
2bdf0 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
2be00 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
2be10 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2be20 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
2be30 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
2be40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
2be50 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2be60 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2be70 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2be80 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2be90 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
2bea0 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
2beb0 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
2bec0 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
2bed0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2bee0 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
2bef0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
2bf00 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2bf10 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
2bf20 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
2bf30 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
2bf40 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
2bf50 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
2bf60 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
2bf70 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
2bf80 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
2bf90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2bfa0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2bfb0 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
2bfc0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
2bfd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2bfe0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2bff0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
2c000 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
2c010 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
2c020 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2c030 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2c040 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
2c050 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
2c060 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2c070 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2c080 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
2c090 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
2c0a0 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
2c0b0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2c0c0 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
2c0d0 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
2c0e0 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
2c0f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2c100 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
2c110 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
2c120 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
2c130 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
2c140 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2c150 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
2c160 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2c170 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
2c180 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
2c190 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
2c1a0 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
2c1b0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
2c1c0 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
2c1d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2c1e0 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
2c1f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2c200 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
2c210 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2c220 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
2c230 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
2c240 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
2c250 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
2c260 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
2c270 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
2c280 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
2c290 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
2c2a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
2c2b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
2c2c0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
2c2d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2c2e0 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
2c2f0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
2c300 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c310 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
2c320 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2c330 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2c340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
2c350 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
2c360 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
2c370 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
2c380 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
2c390 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
2c3a0 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
2c3b0 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
2c3c0 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
2c3d0 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
2c3e0 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
2c3f0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
2c400 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
2c410 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
2c420 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
2c430 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
2c440 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
2c450 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
2c460 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c470 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2c480 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
2c490 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
2c4a0 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
2c4b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
2c4c0 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
2c4d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c4e0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2c4f0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2c500 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
2c510 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2c520 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75  lback = 0;.  w.u
2c530 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
2c540 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
2c550 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
2c560 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
2c570 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
2c580 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
2c590 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
2c5a0 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
2c5b0 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
2c5c0 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
2c5d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2c5e0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2c5f0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2c600 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2c610 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2c620 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2c630 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2c640 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2c650 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2c660 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2c670 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
2c680 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2c690 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2c6a0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
2c6b0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2c6c0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2c6d0 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
2c6e0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
2c6f0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
2c700 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
2c710 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
2c720 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2c730 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2c740 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2c750 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2c760 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2c770 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
2c780 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
2c790 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
2c7a0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2c7b0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
2c7c0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2c7d0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
2c7e0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
2c7f0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
2c800 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
2c810 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
2c820 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2c830 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2c840 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
2c850 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
2c860 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
2c870 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
2c880 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
2c890 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
2c8a0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
2c8b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2c8c0 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
2c8d0 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
2c8e0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
2c8f0 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
2c900 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2c910 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
2c920 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
2c930 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2c940 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
2c950 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2c960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2c970 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
2c980 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c990 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2c9a0 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
2c9b0 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
2c9c0 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
2c9d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2c9e0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
2c9f0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
2ca00 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
2ca10 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
2ca20 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e  Info = pNC->uNC.
2ca30 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73  pAggInfo;..  ass
2ca40 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  ert( pNC->ncFlag
2ca50 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20  s & NC_UAggInfo 
2ca60 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  );.  switch( pEx
2ca70 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2ca80 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
2ca90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2caa0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
2cab0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2cac0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2cad0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2cae0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2caf0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
2cb00 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2cb10 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
2cb20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
2cb30 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2cb40 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
2cb50 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2cb60 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2cb70 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
2cb80 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
2cb90 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
2cba0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2cbb0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
2cbc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2cbd0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2cbe0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2cbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2cc00 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2cc10 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
2cc20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2cc30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2cc40 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2cc50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2cc60 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2cc70 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2cc80 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
2cc90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2cca0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2ccb0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
2ccc0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
2ccd0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
2cce0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
2ccf0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2cd00 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2cd10 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
2cd20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2cd30 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
2cd40 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2cd50 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
2cd60 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
2cd70 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2cd80 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
2cd90 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
2cda0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2cdb0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2cdc0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
2cdd0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
2cde0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
2cdf0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2ce00 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2ce10 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2ce30 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
2ce40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2ce50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ce60 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2ce70 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ce90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2cea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ceb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cec0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
2ced0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2cef0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
2cf00 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
2cf10 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
2cf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2cf40 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
2cf50 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
2cf60 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2cf70 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
2cf80 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
2cf90 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
2cfa0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2cfc0 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
2cfd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
2cfe0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2cff0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2d000 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2d010 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2d020 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d040 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
2d050 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2d060 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
2d070 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2d080 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
2d090 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
2d0a0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2d0b0 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
2d0c0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2d0d0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2d0e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2d0f0 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2d110 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2d130 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
2d140 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
2d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2d160 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
2d170 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2d180 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
2d190 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2d1a0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
2d1b0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
2d1e0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2d1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d200 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2d210 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
2d220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d260 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2d270 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2d280 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2d290 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d2b0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2d2c0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
2d2d0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2d2f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
2d310 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
2d320 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
2d330 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2d340 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
2d350 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
2d360 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
2d370 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
2d380 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
2d390 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
2d3a0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
2d3b0 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
2d3c0 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
2d3d0 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
2d3e0 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
2d3f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
2d400 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2d410 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
2d420 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d430 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2d440 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
2d450 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2d460 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2d470 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d480 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
2d490 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
2d4a0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2d4b0 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
2d4c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d4d0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
2d4e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
2d4f0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
2d500 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2d510 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
2d520 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
2d530 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2d540 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
2d550 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
2d560 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
2d570 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
2d580 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
2d590 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
2d5a0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2d5b0 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
2d5c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d5d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2d5e0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
2d5f0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
2d600 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
2d610 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2d620 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
2d630 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
2d640 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
2d650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
2d660 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2d670 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
2d680 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
2d690 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2d6a0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2d6b0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2d6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2d6d0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2d6e0 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  (0, pItem->pExpr
2d6f0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
2d700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
2d710 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d720 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d730 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
2d740 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
2d750 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
2d760 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
2d770 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
2d780 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
2d790 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
2d7a0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
2d7b0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
2d7c0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
2d7d0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
2d7e0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
2d7f0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2d800 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
2d810 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2d820 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2d830 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2d840 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2d850 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
2d860 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
2d870 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
2d880 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
2d890 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2d8a0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
2d8b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2d8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2d8d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2d8e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2d8f0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2d900 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2d910 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
2d920 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
2d930 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2d940 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2d950 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20  r->u.zToken, .  
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
2d980 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
2d990 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
2d9a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d9b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2d9c0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
2d9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d9e0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2d9f0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2da00 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
2da10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2da20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2da30 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2da40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2da50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2da60 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
2da70 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
2da80 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2da90 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2daa0 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
2dab0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2dac0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2dad0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2dae0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2daf0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
2db00 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2db10 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2db20 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
2db30 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2db40 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
2db50 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2db60 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2db70 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2db80 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2db90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2dba0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
2dbb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2dbc0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2dbd0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
2dbe0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
2dbf0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
2dc00 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2dc10 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2dc20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2dc30 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2dc40 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2dc50 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  pth++;.  return 
2dc60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2dc70 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
2dc80 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2dc90 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20  electEnd(Walker 
2dca0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2dcb0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2dcc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2dcd0 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2dce0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d  er->walkerDepth-
2dcf0 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  -;.}../*.** Anal
2dd00 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
2dd10 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
2dd20 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
2dd30 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
2dd40 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
2dd50 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
2dd60 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
2dd70 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
2dd80 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
2dd90 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
2dda0 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
2ddb0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
2ddc0 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
2ddd0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
2dde0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2ddf0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2de00 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
2de10 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
2de20 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
2de30 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
2de40 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
2de50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2de60 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2de70 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2de80 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
2de90 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2dea0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2deb0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2dec0 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2ded0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2dee0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2def0 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ct;.  w.xSelectC
2df00 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79  allback2 = analy
2df10 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2df20 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c  lectEnd;.  w.wal
2df30 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  kerDepth = 0;.  
2df40 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
2df50 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
2df60 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
2df70 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2df80 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
2df90 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
2dfa0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2dfb0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
2dfc0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
2dfd0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
2dfe0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
2dff0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2e000 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
2e010 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
2e020 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
2e030 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
2e040 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
2e050 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
2e060 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2e070 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2e080 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
2e090 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2e0a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2e0b0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
2e0c0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
2e0d0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
2e0e0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
2e0f0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2e100 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e110 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
2e120 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2e130 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2e140 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
2e150 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
2e160 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
2e170 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
2e180 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
2e190 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2e1a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2e1b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2e1c0 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
2e1d0 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
2e1e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
2e1f0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
2e200 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
2e210 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
2e220 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2e230 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
2e240 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
2e250 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
2e260 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
2e270 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e280 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2e290 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2e2a0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2e2b0 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2e2c0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2e2d0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2e2e0 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72  Reg) ){.    pPar
2e2f0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2e300 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2e310 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2e320 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2e330 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2e340 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2e350 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2e360 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2e370 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2e380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2e390 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2e3a0 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2e3b0 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2e3c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2e3d0 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2e3e0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2e3f0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2e400 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2e410 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70 50  Reg<=n ){.    pP
2e420 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2e430 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
2e440 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
2e450 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
2e460 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
2e470 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
2e480 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
2e490 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
2e4a0 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
2e4b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2e4c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2e4d0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
2e4e0 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
2e4f0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
2e500 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2e510 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a  (pParse, iReg);.
2e520 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2e530 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
2e540 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
2e550 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2e560 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
2e570 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2e580 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
2e590 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
2e5a0 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
2e5b0 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
2e5c0 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
2e5d0 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
2e5e0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2e5f0 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
2e600 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
2e610 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2e620 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2e630 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
2e640 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
2e650 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
2e660 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
2e670 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
2e680 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
2e690 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
2e6a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2e6b0 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
2e6c0 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
2e6d0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
2e6e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2e6f0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
2e700 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
2e710 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2e720 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
2e730 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2e740 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
2e750 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
2e760 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
2e770 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2e780 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70  > iFirst.   && p
2e790 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2e7a0 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20   <= iLast.  ){. 
2e7b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2e7c0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2e7d0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
2e7e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
2e7f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2e800 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
2e810 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2e820 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
2e830 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2e840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2e850 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2e860 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.