/ Hex Artifact Content
Login

Artifact 16dee9504d0c6a09de8aa188fb0989ec3fd48b9704abd4fc80539065f2b52adc:


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 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b  30(p->u.zToken)+
9a10: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9a20: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d  ROUND8(nByte);.}
9a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9a40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9a50: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
9a60: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
9a70: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
9a80: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
9a90: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9aa0: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
9ab0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
9ac0: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
9ad0: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
9ae0: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
9af0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
9b00: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
9b10: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
9b20: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
9b30: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
9b40: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
9b50: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e  ed to by Expr.u.
9b60: 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a  zToken, if any..
9b70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  **.** If the EXP
9b80: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
9b90: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
9ba0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
9bb0: 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63  ncludes .** spac
9bc0: 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61  e to duplicate a
9bd0: 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e  ll Expr nodes in
9be0: 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64   the tree formed
9bf0: 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a   by Expr.pLeft .
9c00: 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67  ** and Expr.pRig
9c10: 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75  ht variables (bu
9c20: 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74  t not for any st
9c30: 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64  ructures pointed
9c40: 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65   to or .** desce
9c50: 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78  nded from the Ex
9c60: 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78  pr.x.pList or Ex
9c70: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72  pr.x.pSelect var
9c80: 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74  iables)..*/.stat
9c90: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9ca0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9cb0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9cc0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28  nByte = 0;.  if(
9cd0: 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20   p ){.    nByte 
9ce0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
9cf0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
9d00: 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50     if( flags&EXP
9d10: 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20  RDUP_REDUCE ){. 
9d20: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75       nByte += du
9d30: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
9d40: 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64  Left, flags) + d
9d50: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
9d60: 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a  pRight, flags);.
9d70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9d80: 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nByte;.}../*.
9d90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9da0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
9db0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c  qlite3ExprDup(),
9dc0: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
9dd0: 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20  pzBuffer .** is 
9de0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70  not NULL then *p
9df0: 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d  zBuffer is assum
9e00: 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ed to point to a
9e10: 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
9e20: 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72  ough .** to stor
9e30: 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78  e the copy of ex
9e40: 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20  pression p, the 
9e50: 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a  copies of p->u.z
9e60: 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70  Token.** (if app
9e70: 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68  licable), and th
9e80: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
9e90: 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e  p->pLeft and p->
9ea0: 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  pRight expressio
9eb0: 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42  ns,.** if any. B
9ec0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
9ed0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65   *pzBuffer is se
9ee0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
9ef0: 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20  yte past the.** 
9f00: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
9f10: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
9f20: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
9f30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
9f40: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
9f50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
9f60: 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20  , int dupFlags, 
9f70: 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a  u8 **pzBuffer){.
9f80: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9fa0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
9fb0: 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20  u8 *zAlloc;     
9fc0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9fd0: 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68  space from which
9fe0: 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f   to build Expr o
9ff0: 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73  bject */.  u32 s
a000: 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20  taticFlag;      
a010: 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66   /* EP_Static if
a020: 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69   space not obtai
a030: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
a040: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  */..  assert( db
a050: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a060: 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
a070: 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64  dupFlags==0 || d
a080: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
a090: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73  _REDUCE );.  ass
a0a0: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
a0b0: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
a0c0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
a0d0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
a0e0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
a0f0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
a100: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28  ucture. */.  if(
a110: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a120: 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66   zAlloc = *pzBuf
a130: 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46  fer;.    staticF
a140: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
a150: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
a160: 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62  lloc = sqlite3Db
a170: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
a180: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c  dupedExprSize(p,
a190: 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20   dupFlags));.   
a1a0: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b   staticFlag = 0;
a1b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45  .  }.  pNew = (E
a1c0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
a1d0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a1e0: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
a1f0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
a200: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
a210: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
a220: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e   to.    ** by pN
a230: 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68  ew. This is eith
a240: 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  er EXPR_FULLSIZE
a250: 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  , EXPR_REDUCEDSI
a260: 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50  ZE or.    ** EXP
a270: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
a280: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
a290: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a2a0: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
a2b0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
a2c0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
a2d0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
a2e0: 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
a2f0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
a300: 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75  nStructSize = du
a310: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
a320: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
a330: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e      const int nN
a340: 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74  ewSize = nStruct
a350: 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20  Size & 0xfff;.  
a360: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20    int nToken;.  
a370: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a380: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
a390: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
a3a0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e  Token ){.      n
a3b0: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  Token = sqlite3S
a3c0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
a3d0: 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65  ken) + 1;.    }e
a3e0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  lse{.      nToke
a3f0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
a400: 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b   if( dupFlags ){
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
a420: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a430: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  , EP_Reduced)==0
a440: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
a450: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
a460: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
a470: 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a  {.      u32 nSiz
a480: 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72  e = (u32)exprStr
a490: 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20  uctSize(p);.    
a4a0: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
a4b0: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
a4c0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52    if( nSize<EXPR
a4d0: 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20  _FULLSIZE ){ .  
a4e0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41        memset(&zA
a4f0: 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20  lloc[nSize], 0, 
a500: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53  EXPR_FULLSIZE-nS
a510: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
a520: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
a530: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
a540: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
a550: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
a560: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
a570: 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c   */.    pNew->fl
a580: 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75  ags &= ~(EP_Redu
a590: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5a0: 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65  |EP_Static|EP_Me
a5b0: 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65  mToken);.    pNe
a5c0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72  w->flags |= nStr
a5d0: 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65  uctSize & (EP_Re
a5e0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a5f0: 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  ly);.    pNew->f
a600: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
a610: 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ag;..    /* Copy
a620: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
a630: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
a640: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b   */.    if( nTok
a650: 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  en ){.      char
a660: 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d   *zToken = pNew-
a670: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
a680: 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53  r*)&zAlloc[nNewS
a690: 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ize];.      memc
a6a0: 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e  py(zToken, p->u.
a6b0: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
a6c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a6d0: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
a6e0: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50  ew->flags) & (EP
a6f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
a700: 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  af)) ){.      /*
a710: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
a720: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
a730: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
a740: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  mber. */.      i
a750: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a760: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
a770: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ct) ){.        p
a780: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  New->x.pSelect =
a790: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a7a0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  p(db, p->x.pSele
a7b0: 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  ct, dupFlags);. 
a7c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a7d0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
a7e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
a7f0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  istDup(db, p->x.
a800: 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29  pList, dupFlags)
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a820: 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  .    /* Fill in 
a830: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
a840: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
a850: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
a860: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a870: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a880: 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46 75 6e  enOnly|EP_WinFun
a890: 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  c) ){.      zAll
a8a0: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a8b0: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a8c0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a8d0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a8e0: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a8f0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a900: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a910: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a930: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a940: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a950: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a960: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a970: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a980: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = 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 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a9b0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a9c0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a9d0: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a9e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a9f0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
aa00: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
aa10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
aa20: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
aa30: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57 69       pNew->y.pWi
aa40: 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  n = sqlite3Windo
aa50: 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70  wDup(db, pNew, p
aa60: 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20  ->y.pWin);.     
aa70: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
aa80: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
aa90: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
aaa0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
aab0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
aac0: 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20  NDOWFUNC */.    
aad0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
aae0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66  {.        *pzBuf
aaf0: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
ab00: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
ab10: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
ab20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
ab30: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
ab40: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
ab50: 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b  if( pNew->op==TK
ab60: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
ab70: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ab80: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
ab90: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ft;.          as
aba0: 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e  sert( p->iColumn
abb0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
abc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
abd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
abe0: 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69  ht==0  || p->pRi
abf0: 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b  ght==p->pLeft );
ac00: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ac10: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
ac20: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
ac30: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
ac40: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
ac50: 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d   }.        pNew-
ac60: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
ac70: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac80: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
ac90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
aca0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
acb0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64  /*.** Create and
acc0: 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20 63   return a deep c
acd0: 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63  opy of the objec
ace0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
acf0: 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
ad00: 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63  ent. If an OOM c
ad10: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
ad20: 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73  untered, NULL is
ad30: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
ad40: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
ad50: 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a  ailed flag set..
ad60: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
ad70: 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69  E_OMIT_CTE.stati
ad80: 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70 28  c With *withDup(
ad90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
ada0: 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70  h *p){.  With *p
adb0: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
adc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
add0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
ade0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
adf0: 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a   * (p->nCte-1);.
ae00: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
ae10: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ae20: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
ae30: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
ae40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52   int i;.      pR
ae50: 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43  et->nCte = p->nC
ae60: 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  te;.      for(i=
ae70: 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
ae80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  +){.        pRet
ae90: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
aea0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
aeb0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53  p(db, p->a[i].pS
aec0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
aed0: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43     pRet->a[i].pC
aee0: 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ols = sqlite3Exp
aef0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
af00: 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a  a[i].pCols, 0);.
af10: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
af20: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
af30: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
af40: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
af50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
af60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
af70: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
af80: 20 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a   withDup(x,y) 0.
af90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
afa0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
afb0: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
afc0: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
afd0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
afe0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
aff0: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
b000: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
b010: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
b020: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
b030: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
b040: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
b050: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
b060: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
b070: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
b080: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
b090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
b0a0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
b0b0: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
b0c0: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
b0d0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
b0e0: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
b0f0: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
b100: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
b110: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
b120: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
b130: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
b140: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
b150: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
b160: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
b170: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
b180: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
b190: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
b1a0: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  uplicated..**.**
b1b0: 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   The flags param
b1c0: 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20  eter contains a 
b1d0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
b1e0: 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66  he EXPRDUP_XXX f
b1f0: 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  lags..** If the 
b200: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
b210: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
b220: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
b230: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
b240: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
b250: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
b260: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
b270: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
b280: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
b290: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
b2a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
b2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
b2c0: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
b2d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
b2e0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
b2f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b300: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
b310: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52  0 || flags==EXPR
b320: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
b330: 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44  return p ? exprD
b340: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
b350: 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c   0) : 0;.}.ExprL
b360: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
b370: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
b380: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
b390: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b3a0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
b3b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b3c0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
b3d0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
b3e0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f  i;.  Expr *pPrio
b3f0: 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a  rSelectCol = 0;.
b400: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b410: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b430: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b440: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69  ocRawNN(db, sqli
b450: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
b460: 64 62 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70  db, p));.  if( p
b470: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b480: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
b490: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
b4a0: 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a  Item = pNew->a;.
b4b0: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
b4c0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
b4d0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
b4e0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
b4f0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
b500: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
b510: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
b520: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b530: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
b540: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b550: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
b560: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
b570: 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26  OldExpr .     &&
b580: 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54   pOldExpr->op==T
b590: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a  K_SELECT_COLUMN.
b5a0: 20 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70       && (pNewExp
b5b0: 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
b5c0: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
b5d0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
b5e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
b5f0: 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  || i>0 );.      
b600: 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  if( pNewExpr->iC
b610: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
b620: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
b630: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c  Expr->pLeft==pOl
b640: 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b  dExpr->pRight );
b650: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53  .        pPriorS
b660: 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45  electCol = pNewE
b670: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  xpr->pLeft = pNe
b680: 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  wExpr->pRight;. 
b690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b6a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
b6b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b6c0: 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  t( pItem[-1].pEx
b6d0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
b6e0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b6f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65  r->iColumn==pIte
b700: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  m[-1].pExpr->iCo
b710: 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20  lumn+1 );.      
b720: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
b730: 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d  SelectCol==pItem
b740: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66  [-1].pExpr->pLef
b750: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
b760: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
b770: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a  PriorSelectCol;.
b780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b790: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
b7a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b7b0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b7c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
b7d0: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
b7e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b7f0: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
b800: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
b810: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
b820: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
b830: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
b840: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
b850: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
b860: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
b870: 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65     pItem->bSorte
b880: 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rRef = pOldItem-
b890: 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20 20  >bSorterRef;.   
b8a0: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
b8b0: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
b8c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
b8d0: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
b8e0: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
b8f0: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
b900: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
b910: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
b920: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
b930: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
b940: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
b950: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
b960: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
b970: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
b980: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
b990: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
b9a0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
b9b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
b9c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b9d0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
b9e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b9f0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
ba00: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ba10: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ba20: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
ba30: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
ba40: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
ba50: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
ba60: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
ba70: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
ba80: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
ba90: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
baa0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bab0: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
bac0: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
bad0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
bae0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
baf0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
bb00: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bb10: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
bb20: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
bb30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bb40: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
bb50: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
bb60: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
bb70: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
bb80: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
bb90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
bba0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
bbb0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
bbc0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
bbd0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
bbe0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
bbf0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
bc00: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
bc10: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
bc20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
bc30: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
bc40: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bc50: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
bc60: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bc70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bc80: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bc90: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bca0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
bcb0: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
bcc0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bcd0: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
bce0: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
bcf0: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
bd00: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
bd10: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
bd20: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
bd30: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bd40: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
bd50: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
bd60: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
bd70: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
bd80: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
bd90: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
bda0: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
bdb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
bdc0: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
bdd0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
bde0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
bdf0: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
be00: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
be10: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
be20: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
be30: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
be40: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
be50: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
be60: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
be70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
be80: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
be90: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
bea0: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
beb0: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
bec0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
bed0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
bee0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
bef0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  {.      pTab->nT
bf00: 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  abRef++;.    }. 
bf10: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
bf20: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
bf30: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
bf40: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
bf50: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
bf60: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
bf70: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
bf80: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
bf90: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
bfa0: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
bfb0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
bfc0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
bfd0: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
bfe0: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
bff0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
c000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c010: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
c020: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
c030: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
c040: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
c050: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
c060: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
c070: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
c080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
c090: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c0a0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c0b0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
c0c0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
c0d0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
c0e0: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
c0f0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
c100: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c110: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
c120: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
c130: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
c140: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c150: 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  NN(db, pNew);.  
c160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c170: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
c180: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
c190: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
c1a0: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
c1b0: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
c1c0: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
c1d0: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
c1e0: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
c1f0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
c200: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
c210: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
c220: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
c230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c240: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c250: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c260: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
c270: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
c280: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
c290: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
c2a0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
c2b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
c2c0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c2d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
c2e0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c2f0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
c300: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
c310: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
c320: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c330: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c340: 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c 20  , Select *pDup, 
c350: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
c360: 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  lect *pRet = 0;.
c370: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
c380: 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 2a  = 0;.  Select **
c390: 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53 65  pp = &pRet;.  Se
c3a0: 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73 65  lect *p;..  asse
c3b0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 66  rt( db!=0 );.  f
c3c0: 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70 3d  or(p=pDup; p; p=
c3d0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
c3e0: 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73  Select *pNew = s
c3f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c400: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
c410: 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  p) );.    if( pN
c420: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
c430: 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20     pNew->pEList 
c440: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c450: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
c460: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  st, flags);.    
c470: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
c480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
c490: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
c4a0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  s);.    pNew->pW
c4b0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c4c0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
c4d0: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ere, flags);.   
c4e0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
c4f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c500: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
c510: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
c520: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
c530: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c540: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
c550: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c560: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
c570: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c580: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
c590: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c5a0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
c5b0: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
c5c0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65  = pNext;.    pNe
c5d0: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
c5e0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
c5f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c600: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
c610: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c620: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
c630: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
c640: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  = 0;.    pNew->s
c650: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
c660: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
c670: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
c680: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c690: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[0] = -1;.    p
c6a0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
c6b0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70  m[1] = -1;.    p
c6c0: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
c6d0: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
c6e0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  .    pNew->pWith
c6f0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
c700: 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64 65  ->pWith);.#ifnde
c710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
c720: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e 65  NDOWFUNC.    pNe
c730: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
c740: 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e 20   pNew->pWinDefn 
c750: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  = sqlite3WindowL
c760: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  istDup(db, p->pW
c770: 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64 69 66 0a  inDefn);.#endif.
c780: 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20      pNew->selId 
c790: 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20 20 20  = p->selId;.    
c7a0: 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  *pp = pNew;.    
c7b0: 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72 69  pp = &pNew->pPri
c7c0: 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  or;.    pNext = 
c7d0: 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pNew;.  }..  ret
c7e0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
c7f0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
c800: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c810: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c820: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c830: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
c840: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
c850: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
c860: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
c870: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
c880: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c890: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
c8a0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
c8b0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
c8c0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
c8d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ist..**.** The p
c8e0: 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  List argument mu
c8f0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55 4c  st be either NUL
c900: 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74  L or a pointer t
c910: 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a 2a  o an ExprList.**
c920: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
c930: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
c940: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c950: 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72 6f  pend().  This ro
c960: 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74  utine.** may not
c970: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
c980: 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69 6e   ExprList obtain
c990: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ed from sqlite3E
c9a0: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c9b0: 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20 72   Reason:  This r
c9c0: 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74  outine assumes t
c9d0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
c9e0: 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73 74  f slots in pList
c9f0: 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70 6f  ->a[].** is a po
ca00: 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68 61  wer of two.  Tha
ca10: 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73 71  t is true for sq
ca20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ca30: 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a 2a  end() returns.**
ca40: 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63 65   but is not nece
ca50: 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72 6f  ssarily true fro
ca60: 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  m the return val
ca70: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78 70  ue of sqlite3Exp
ca80: 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a  rListDup()..**.*
ca90: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
caa0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
cab0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
cac0: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
cad0: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
cae0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
caf0: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
cb00: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
cb10: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
cb20: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
cb30: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
cb40: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
cb50: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
cb60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
cb70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cb80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
cb90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cba0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cbb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
cbc0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
cbd0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
cbe0: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
cbf0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
cc00: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
cc10: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
cc20: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
cc30: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
cc40: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
cc50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cc60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
cc70: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
cc80: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cc90: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
cca0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
ccb0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
ccc0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
ccd0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
cce0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
ccf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
cd00: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d  ->nExpr = 0;.  }
cd10: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
cd20: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
cd30: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
cd40: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
cd50: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
cd60: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
cd70: 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20  (db, pList, .   
cd80: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
cd90: 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73  (*pList)+(2*pLis
cda0: 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73 69  t->nExpr - 1)*si
cdb0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
cdc0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
cdd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
cde0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
cdf0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
ce00: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
ce10: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
ce20: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73  >nExpr++];.  ass
ce30: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74  ert( offsetof(st
ce40: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ce50: 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f  em,zName)==sizeo
ce60: 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  f(pItem->pExpr) 
ce70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
ce80: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
ce90: 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70 72  rList_item,pExpr
cea0: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  )==0 );.  memset
ceb0: 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30  (&pItem->zName,0
cec0: 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d  ,sizeof(*pItem)-
ced0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cee0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e  ExprList_item,zN
cef0: 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  ame));.  pItem->
cf00: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
cf10: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
cf20: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
cf30: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
cf40: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
cf50: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
cf60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
cf70: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
cf80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
cf90: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
cfa0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
cfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
cfc0: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d  s and pExpr form
cfd0: 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e   a vector assign
cfe0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61  ment which is pa
cff0: 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a  rt of the SET.**
d000: 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50   clause of an UP
d010: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  DATE statement. 
d020: 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
d030: 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29  *        (a,b,c)
d040: 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c   = (expr1,expr2,
d050: 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20  expr3).** Or:   
d060: 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45   (a,b,c) = (SELE
d070: 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e  CT x,y,z FROM ..
d080: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ..).**.** For ea
d090: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76  ch term of the v
d0a0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
d0b0: 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74  , append new ent
d0c0: 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ries to the.** e
d0d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d0e0: 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61  List.  In the ca
d0f0: 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  se of a subquery
d100: 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70   on the RHS, app
d110: 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54  end.** TK_SELECT
d120: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
d130: 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ons..*/.ExprList
d140: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
d150: 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20  tAppendVector(. 
d160: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d170: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d180: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d190: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
d1a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
d1b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
d1c0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
d1d0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
d1e0: 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20  olumns,      /* 
d1f0: 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66  List of names of
d200: 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69   LHS of the assi
d210: 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  gnment */.  Expr
d220: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
d230: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70     /* Vector exp
d240: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
d250: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
d260: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
d270: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d280: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b  se->db;.  int n;
d290: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d2a0: 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f  iFirst = pList ?
d2b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
d2c0: 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73  0;.  /* pColumns
d2d0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c   can only be NUL
d2e0: 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20  L due to an OOM 
d2f0: 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20  but an OOM will 
d300: 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78  cause an.  ** ex
d310: 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  it prior to this
d320: 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69   routine being i
d330: 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20  nvoked */.  if( 
d340: 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d  NEVER(pColumns==
d350: 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72  0) ) goto vector
d360: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
d370: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
d380: 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65  goto vector_appe
d390: 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  nd_error;..  /* 
d3a0: 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
d3b0: 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20  vector, then we 
d3c0: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  can immediately 
d3d0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
d3e0: 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  t .  ** the size
d3f0: 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20   of the RHS and 
d400: 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20  LHS match.  But 
d410: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  if the RHS is a 
d420: 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69  SELECT, .  ** wi
d430: 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e  ldcards ("*") in
d440: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d450: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75  of the SELECT mu
d460: 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
d470: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61  efore.  ** we ca
d480: 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68  n do the size ch
d490: 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68  eck, so defer th
d4a0: 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74  e size check unt
d4b0: 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
d4c0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
d4d0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  Expr->op!=TK_SEL
d4e0: 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d  ECT && pColumns-
d4f0: 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33  >nId!=(n=sqlite3
d500: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d510: 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71  Expr)) ){.    sq
d520: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d530: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
d540: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
d550: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
d560: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
d570: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
d580: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
d590: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
d5a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
d5b0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b  olumns->nId; i++
d5c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75  ){.    Expr *pSu
d5d0: 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  bExpr = sqlite3E
d5e0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
d5f0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
d600: 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   i);.    pList =
d610: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d620: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
d630: 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b  List, pSubExpr);
d640: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
d650: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d660: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46  pList->nExpr==iF
d670: 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20  irst+i+1 );.    
d680: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
d690: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
d6a0: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69   = pColumns->a[i
d6b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
d6c0: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d6d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
d6e0: 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   }..  if( !db->m
d6f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70  allocFailed && p
d700: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
d710: 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c  ECT && ALWAYS(pL
d720: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45  ist!=0) ){.    E
d730: 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c  xpr *pFirst = pL
d740: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70  ist->a[iFirst].p
d750: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
d760: 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20  ( pFirst!=0 );. 
d770: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73     assert( pFirs
d780: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  t->op==TK_SELECT
d790: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
d7a0: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
d7b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d7c0: 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20  nt in pRight so 
d7d0: 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  it will be delet
d7e0: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73  ed when.    ** s
d7f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d800: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
d810: 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e   */.    pFirst->
d820: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
d830: 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a      pExpr = 0;..
d840: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
d850: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d860: 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f  LHS in iTable so
d870: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65   that we can che
d880: 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ck that.    ** t
d890: 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73  he RHS and LHS s
d8a0: 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e  izes match durin
d8b0: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
d8c0: 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  n. */.    pFirst
d8d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75  ->iTable = pColu
d8e0: 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76  mns->nId;.  }..v
d8f0: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d900: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
d910: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
d920: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
d930: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d940: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
d950: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d960: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
d970: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
d980: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
d990: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
d9a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d9b0: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
d9c0: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
d9d0: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
d9e0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
d9f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
da00: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
da10: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
da20: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
da30: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
da40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
da50: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
da60: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
da70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
da80: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
da90: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
daa0: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
dab0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
dac0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
dad0: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
dae0: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
daf0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
db00: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
db10: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
db20: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
db30: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
db40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
db50: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
db60: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
db70: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
db80: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
db90: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
dba0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
dbb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
dbc0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
dbd0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
dbe0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
dbf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
dc00: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
dc10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
dc20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
dc30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
dc40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
dc50: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
dc60: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
dc70: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
dc80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
dc90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
dca0: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
dcb0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dcd0: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
dce0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
dcf0: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
dd00: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
dd10: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
dd20: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
dd30: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
dd40: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
dd50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
dd60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
dd70: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
dd80: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
dd90: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
dda0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
ddb0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
ddc0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
ddd0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
dde0: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
ddf0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
de00: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
de10: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
de20: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
de30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
de40: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
de50: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
de60: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
de70: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
de80: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  pItem->zName, pN
de90: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
dea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
deb0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
dec0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
ded0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
dee0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
def0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
df00: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
df10: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
df20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
df30: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
df40: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
df50: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
df60: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
df70: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
df80: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
df90: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
dfa0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
dfb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dfc0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
dfd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dfe0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
dff0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
e000: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e010: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
e020: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
e030: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
e040: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
e050: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
e060: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
e070: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
e080: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
e090: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
e0a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e0b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
e0c0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
e0d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
e0e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
e0f0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
e100: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e110: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
e120: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
e130: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e140: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e150: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e160: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e170: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
e180: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
e190: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
e1a0: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
e1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e1c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e1d0: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
e1e0: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
e1f0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
e200: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
e210: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
e220: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e230: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
e240: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
e250: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e260: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
e270: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
e280: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
e290: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
e2a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e2b0: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
e2c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e2d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
e2e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
e2f0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e300: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
e310: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
e320: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
e330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e340: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e350: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
e360: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
e370: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e380: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
e390: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
e3b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
e3c0: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e3d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e3e0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e3f0: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
e400: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
e410: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e420: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
e430: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
e440: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e450: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
e460: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e470: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
e480: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e490: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
e4a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e4b0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e4c0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e4d0: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
e4e0: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
e4f0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
e500: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
e510: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e520: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
e530: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e540: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
e550: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e560: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
e570: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e580: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
e590: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
e5a0: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
e5b0: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
e5c0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
e5d0: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
e5e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e5f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
e600: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
e610: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
e620: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e630: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e640: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e650: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
e660: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
e670: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e680: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
e690: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
e6a0: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
e6b0: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
e6c0: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
e6d0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
e6e0: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
e6f0: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
e700: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
e710: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
e720: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
e730: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
e740: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
e750: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
e760: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
e770: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
e780: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
e790: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
e7a0: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
e7b0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
e7c0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
e7d0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
e7e0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
e7f0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
e800: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
e810: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
e820: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
e830: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
e840: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
e850: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
e860: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
e870: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
e880: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
e890: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
e8a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
e8b0: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
e8c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e8d0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
e8e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e8f0: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
e900: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
e910: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e920: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
e930: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
e940: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
e950: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e960: 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29  .zToken, "true")
e970: 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  ==0.   || sqlite
e980: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
e990: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65  u.zToken, "false
e9a0: 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  ")==0.  ){.    p
e9b0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52  Expr->op = TK_TR
e9c0: 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74  UEFALSE;.    ret
e9d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
e9e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e9f0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  The argument mus
ea00: 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41  t be a TK_TRUEFA
ea10: 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  LSE Expr node.  
ea20: 52 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69  Return 1 if it i
ea30: 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20  s TRUE.** and 0 
ea40: 69 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a  if it is FALSE..
ea50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ea60: 70 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e  prTruthValue(con
ea70: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  st Expr *pExpr){
ea80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
ea90: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
eaa0: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
eab0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
eac0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
ead0: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
eae0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
eaf0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
eb00: 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29  en,"false")==0 )
eb10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  ;.  return pExpr
eb20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
eb30: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ;.}.../*.** Thes
eb40: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
eb50: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
eb60: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
eb70: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
eb80: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
eb90: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
eba0: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
ebb0: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
ebc0: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
ebd0: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
ebe0: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
ebf0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
ec00: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
ec10: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
ec20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
ec30: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
ec40: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
ec50: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
ec60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ec70: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
ec80: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
ec90: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
eca0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ecb0: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
ecc0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
ecd0: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
ece0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
ecf0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
ed00: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
ed10: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
ed20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
ed30: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
ed40: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
ed50: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
ed60: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
ed70: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
ed80: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
ed90: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
eda0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
edb0: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
edc0: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
edd0: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
ede0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
edf0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
ee00: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
ee10: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
ee20: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
ee30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ee40: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
ee50: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
ee60: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
ee70: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
ee80: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
ee90: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
eea0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
eeb0: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
eec0: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
eed0: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
eee0: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
eef0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
ef00: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
ef10: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
ef20: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
ef30: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ef40: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
ef50: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
ef60: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
ef70: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
ef80: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
ef90: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
efa0: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
efb0: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
efc0: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
efd0: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
efe0: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
eff0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
f000: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
f010: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
f020: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
f030: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
f040: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
f050: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
f060: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
f070: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
f080: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
f090: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
f0a0: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
f0b0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
f0c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
f0d0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
f0e0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
f0f0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
f100: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
f110: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f120: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f130: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
f140: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f150: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f160: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
f170: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
f180: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
f190: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
f1a0: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
f1b0: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
f1c0: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
f1d0: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
f1e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
f1f0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
f200: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
f210: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
f220: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
f230: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
f240: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
f250: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
f260: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
f270: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
f280: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
f290: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
f2a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
f2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
f2c0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f2d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f2e0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
f2f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f300: 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ID:.      /* Con
f310: 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22  vert "true" or "
f320: 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41  false" in a DEFA
f330: 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ULT clause into 
f340: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70  the.      ** app
f350: 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45  ropriate TK_TRUE
f360: 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a  FALSE operator *
f370: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
f380: 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46  te3ExprIdToTrueF
f390: 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
f3a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f3b0: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
f3c0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
f3d0: 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
f3e0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
f3f0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
f400: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
f410: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
f420: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f430: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
f440: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f450: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
f460: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
f470: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f480: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
f490: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
f4a0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f4b0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
f4c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
f4d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
f4e0: 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
f4f0: 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   && pWalker->eCo
f500: 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  de!=2 ){.       
f510: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
f520: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
f530: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
f540: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
f550: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
f560: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
f570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f580: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
f590: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
f5a0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
f5b0: 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
f5c0: 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54  _ROW:.    case T
f5d0: 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20  K_REGISTER:.    
f5e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f5f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
f600: 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
f610: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f620: 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
f630: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
f640: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
f650: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f660: 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  ort;.    case TK
f670: 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20  _VARIABLE:.     
f680: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
f690: 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  ode==5 ){.      
f6a0: 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f    /* Silently co
f6b0: 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61  nvert bound para
f6c0: 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65  meters that appe
f6d0: 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45  ar inside of CRE
f6e0: 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ATE.        ** s
f6f0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61  tatements into a
f700: 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69   NULL when parsi
f710: 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ng the CREATE st
f720: 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74  atement text out
f730: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
f740: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f750: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f760: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
f770: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  _NULL;.      }el
f780: 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  se if( pWalker->
f790: 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20  eCode==4 ){.    
f7a0: 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70      /* A bound p
f7b0: 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52  arameter in a CR
f7c0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
f7d0: 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
f7e0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  rom.        ** s
f7f0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
f800: 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72   causes an error
f810: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c   */.        pWal
f820: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f830: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f840: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
f850: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
f860: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64  through */.    d
f870: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65  efault:.      te
f880: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f890: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
f8a0: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
f8b0: 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c  WalkFail() disal
f8c0: 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  lows */.      te
f8d0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f8e0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
f8f0: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
f900: 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c  WalkFail() disal
f910: 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65  lows */.      re
f920: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
f930: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
f940: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
f950: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
f960: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
f970: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
f980: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
f990: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
f9a0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
f9b0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
f9c0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f9d0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
f9e0: 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20  alkFail;.#ifdef 
f9f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
fa00: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
fa10: 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
fa20: 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
fa30: 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20  ndif.  w.u.iCur 
fa40: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
fa50: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
fa60: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
fa70: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
fa80: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
fa90: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
faa0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
fab0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
fac0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
fad0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
fae0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
faf0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
fb00: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
fb10: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
fb20: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
fb30: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
fb40: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
fb50: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
fb60: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
fb70: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
fb80: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
fb90: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
fba0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
fbb0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
fbc0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
fbd0: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
fbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
fbf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
fc00: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
fc10: 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28  ero if.**.**   (
fc20: 31 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  1) the expressio
fc30: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61  n is constant, a
fc40: 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20  nd.**   (2) the 
fc50: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
fc60: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
fc70: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
fc80: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  use.**       of 
fc90: 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
fca0: 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78  .**   (3) the ex
fcb0: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
fcc0: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50  t contain any EP
fcd0: 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c  _FixedCol TK_COL
fce0: 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65  UMN.**       ope
fcf0: 72 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79  rands created by
fd00: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72   the constant pr
fd10: 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69  opagation optimi
fd20: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  zation..**.** Wh
fd30: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
fd40: 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74  returns true, it
fd50: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
fd60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
fd70: 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74  * can be added t
fd80: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43  o the pParse->pC
fd90: 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e  onstExpr list an
fda0: 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  d evaluated once
fdb0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65   when.** the pre
fdc0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
fdd0: 73 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20  starts up.  See 
fde0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
fdf0: 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20  tInit()..*/.int 
fe00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fe10: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
fe20: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
fe30: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
fe40: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
fe50: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
fe60: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
fe70: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
fe80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
fe90: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
fea0: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
feb0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
fec0: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
fed0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
fee0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
fef0: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
ff00: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
ff10: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
ff20: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
ff30: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
ff40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ff50: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
ff60: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
ff70: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
ff80: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ff90: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a  3, iCur);.}.../*
ffa0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
ffb0: 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
ffc0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  sed by sqlite3Ex
ffd0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
ffe0: 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74  oupBy()..*/.stat
fff0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
10000 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10010 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  By(Walker *pWalk
10020 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
10030 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  {.  ExprList *pG
10040 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72  roupBy = pWalker
10050 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20  ->u.pGroupBy;.  
10060 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65  int i;..  /* Che
10070 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69  ck if pExpr is i
10080 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20  dentical to any 
10090 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49  GROUP BY term. I
100a0 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20  f so, consider. 
100b0 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e   ** it constant.
100c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
100d0 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
100e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
100f0 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d  r *p = pGroupBy-
10100 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
10110 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10120 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
10130 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
10140 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
10150 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10160 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65  NNCollSeq(pWalke
10170 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  r->pParse, p);. 
10180 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10190 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20  IsBinary(pColl) 
101a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
101b0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
101c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
101d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45    /* Check if pE
101e0 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c  xpr is a sub-sel
101f0 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73  ect. If so, cons
10200 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65  ider it variable
10210 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  . */.  if( ExprH
10220 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
10230 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
10240 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
10250 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
10260 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
10270 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65  .  }..  return e
10280 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10290 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  t(pWalker, pExpr
102a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
102b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
102c0 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74  tree passed as t
102d0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
102e0 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  t. Return non-ze
102f0 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ro.** if the exp
10300 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73  ression consists
10310 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
10320 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73  stants or copies
10330 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e   of terms .** in
10340 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73   pGroupBy that s
10350 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e  ort with the BIN
10360 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ARY collation se
10370 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
10380 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10390 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
103a0 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  if a term of the
103b0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63   HAVING clause c
103c0 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65  an.** be promote
103d0 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45  d into the WHERE
103e0 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64   clause.  In ord
103f0 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72  er for such a pr
10400 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c  omotion to work,
10410 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
10420 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
10430 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  se term must be 
10440 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c  the same for all
10450 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61   members of.** a
10460 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72   "group".  The r
10470 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
10480 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
10490 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59  m must be BINARY
104a0 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74  .** assumes that
104b0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74   no other collat
104c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
104d0 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67  l have a finer-g
104e0 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69  rained.** groupi
104f0 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20  ng than binary. 
10500 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   In other words 
10510 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e  (A=B COLLATE bin
10520 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  ary) implies.** 
10530 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68  A=B in every oth
10540 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
10550 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75  uence.  The requ
10560 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
10570 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20  .** GROUP BY be 
10580 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74  BINARY is strict
10590 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  er than necessar
105a0 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73  y.  It would als
105b0 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f  o work.** to pro
105c0 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75  mote HAVING clau
105d0 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
105e0 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76   same alternativ
105f0 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
10600 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47  equence as the G
10610 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75  ROUP BY term, bu
10620 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68  t that is much h
10630 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a  arder to check,.
10640 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  ** alternative c
10650 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10660 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c  es are uncommon,
10670 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c   and this is onl
10680 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  y an.** optimiza
10690 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65  tion, so we take
106a0 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75   the easy way ou
106b0 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71  t and simply req
106c0 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55  uire the.** GROU
106d0 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20  P BY to use the 
106e0 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67  BINARY collating
106f0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e   sequence..*/.in
10700 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
10710 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
10720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10730 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73  Expr *p, ExprLis
10740 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20  t *pGroupBy){.  
10750 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
10760 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
10770 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
10780 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f  rNodeIsConstantO
10790 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53  rGroupBy;.  w.xS
107a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
107b0 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42  0;.  w.u.pGroupB
107c0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
107d0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
107e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
107f0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
10800 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
10810 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
10820 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10830 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10840 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
10850 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
10860 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
10870 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
10880 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
10890 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
108a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
108b0 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
108c0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
108d0 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
108e0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
108f0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10900 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
10910 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10920 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10930 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10940 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10950 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10960 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10970 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
10980 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20  ion(Expr *p, u8 
10990 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72  isInit){.  asser
109a0 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t( isInit==0 || 
109b0 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72  isInit==1 );.  r
109c0 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
109d0 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30  t(p, 4+isInit, 0
109e0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
109f0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
10a00 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61  R_HINTS./*.** Wa
10a10 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10a20 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
10a30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10a40 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  on contains a.**
10a50 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d   subquery of som
10a60 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20  e kind.  Return 
10a70 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  0 if there are n
10a80 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f  o subqueries..*/
10a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10aa0 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79  ContainsSubquery
10ab0 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c  (Expr *p){.  Wal
10ac0 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
10ad0 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
10ae0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
10af0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
10b00 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
10b10 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
10b20 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
10b30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10b40 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10b50 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
10b60 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
10b70 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10b80 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
10b90 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
10ba0 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
10bb0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
10bc0 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
10bd0 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
10be0 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
10bf0 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
10c00 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
10c10 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
10c20 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
10c30 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
10c40 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
10c50 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
10c60 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
10c70 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
10c80 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
10c90 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
10ca0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
10cb0 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
10cc0 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
10cd0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
10ce0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10cf0 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
10d00 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
10d10 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  c = 0;.  if( p==
10d20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
10d30 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
10d40 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f  n following on O
10d50 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  OM */..  /* If a
10d60 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
10d70 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
10d80 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
10d90 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
10da0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
10db0 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
10dc0 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
10dd0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
10de0 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
10df0 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
10e00 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
10e10 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
10e20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
10e30 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
10e40 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
10e50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
10e60 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
10e70 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
10e80 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
10e90 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
10ea0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
10eb0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
10ec0 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
10ed0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
10ee0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
10ef0 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
10f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10f10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
10f20 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
10f30 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
10f40 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10f50 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
10f60 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
10f70 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
10f80 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
10f90 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
10fa0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
10fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10fc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10fd0 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
10fe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11000 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
11010 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
11020 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
11030 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
11040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
11050 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
11060 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
11070 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
11080 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
11090 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
110a0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
110b0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
110c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
110d0 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
110e0 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
110f0 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
11100 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
11110 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
11120 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
11130 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
11140 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
11150 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
11160 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
11170 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
11180 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
11190 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
111a0 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
111b0 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
111c0 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
111d0 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
111e0 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
111f0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
11200 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
11210 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
11220 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
11230 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
11240 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
11250 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
11260 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
11270 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
11280 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
11290 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
112a0 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
112b0 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
112c0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
112d0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
112e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
112f0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
11300 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
11310 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11320 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
11330 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
11340 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
11350 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
11360 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
11370 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
11380 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
11390 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
113a0 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
113b0 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
113c0 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30      p->y.pTab==0
113d0 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63   ||  /* Referenc
113e0 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  e to column of i
113f0 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69  ndex on expressi
11400 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
11410 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
11420 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 2d 3e  0 && p->y.pTab->
11430 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
11440 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
11450 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11460 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
11470 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11480 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11490 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
114a0 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
114b0 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
114c0 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
114d0 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
114e0 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
114f0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
11500 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
11510 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
11520 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11530 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
11540 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
11550 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
11560 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
11570 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
11580 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
11590 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
115a0 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
115b0 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
115c0 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
115d0 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
115e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
115f0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
11600 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
11610 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
11620 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
11630 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
11640 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
11650 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
11660 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
11670 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
11680 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
11690 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
116a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
116b0 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
116c0 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
116d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
116e0 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
116f0 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
11700 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
11710 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
11720 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
11730 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
11740 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
11750 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
11760 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
11770 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11780 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11790 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
117a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
117b0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
117c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
117d0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
117e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
117f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
11800 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
11810 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
11820 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
11830 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
11840 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
11850 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
11860 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
11870 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
11880 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
11890 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
118a0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
118b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
118c0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
118d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
118e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
118f0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11900 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
11910 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
11920 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
11930 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
11940 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
11950 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
11960 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
11970 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11980 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11990 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
119a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
119b0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
119c0 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
119d0 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
119e0 6e 20 30 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  n 0;.}.#ifdef SQ
119f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
11a00 41 4c 49 5a 45 0a 69 6e 74 20 73 71 6c 69 74 65  ALIZE.int sqlite
11a10 33 49 73 52 6f 77 69 64 4e 28 63 6f 6e 73 74 20  3IsRowidN(const 
11a20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
11a30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11a40 72 4e 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  rNICmp(z, "_ROWI
11a50 44 5f 22 2c 20 6e 29 3d 3d 30 20 29 20 72 65 74  D_", n)==0 ) ret
11a60 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
11a70 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 2c 20  ite3StrNICmp(z, 
11a80 22 52 4f 57 49 44 22 2c 20 6e 29 3d 3d 30 20 29  "ROWID", n)==0 )
11a90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11aa0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
11ab0 28 7a 2c 20 22 4f 49 44 22 2c 20 6e 29 3d 3d 30  (z, "OID", n)==0
11ac0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
11ad0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
11ae0 66 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74  f../*.** pX is t
11af0 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20  he RHS of an IN 
11b00 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58  operator.  If pX
11b10 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74 61   is a SELECT sta
11b20 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20  tement .** that 
11b30 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65  can be simplifie
11b40 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61  d to a direct ta
11b50 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e  ble access, then
11b60 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
11b70 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45  nter to the SELE
11b80 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  CT statement.  I
11b90 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45  f pX is not a SE
11ba0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
11bb0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c  ** or if the SEL
11bc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65  ECT statement ne
11bd0 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65  eds to be manife
11be0 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  sted into a tran
11bf0 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20  sient.** table, 
11c00 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c  then return NULL
11c10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11c20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11c30 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20  Y.static Select 
11c40 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49  *isCandidateForI
11c50 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a  nOpt(Expr *pX){.
11c60 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53    Select *p;.  S
11c70 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
11c80 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11c90 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
11ca0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11cb0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11cc0 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
11cd0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  t) ) return 0;  
11ce0 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72  /* Not a subquer
11cf0 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  y */.  if( ExprH
11d00 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11d10 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29 20  P_VarSelect)  ) 
11d20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
11d30 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f  rrelated subq */
11d40 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65  .  p = pX->x.pSe
11d50 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  lect;.  if( p->p
11d60 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
11d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d80 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
11d90 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
11da0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
11db0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
11dc0 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
11dd0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
11de0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
11df0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
11e00 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
11e10 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ct );.    testca
11e20 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
11e30 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
11e40 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
11e50 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
11e60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
11e70 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
11e80 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
11e90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
11ea0 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
11eb0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
11ec0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
11ed0 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
11ee0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
11ef0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
11f00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11f10 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
11f20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
11f30 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
11f40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11f50 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
11f60 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
11f70 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
11f80 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
11f90 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
11fa0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
11fb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11fc0 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
11fd0 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
11fe0 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
11ff0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
12000 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
12010 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
12020 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
12030 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
12040 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73  >a[0].pTab;.  as
12050 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
12060 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
12070 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
12080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
12090 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
120a0 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
120b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
120c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
120d0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
120e0 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
120f0 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
12100 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
12110 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
12120 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53  =0 );.  /* All S
12130 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75  ELECT results mu
12140 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a  st be columns. *
12150 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
12160 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
12170 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  +){.    Expr *pR
12180 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  es = pEList->a[i
12190 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
121a0 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f   pRes->op!=TK_CO
121b0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
121c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
121d0 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  s->iTable==pSrc-
121e0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b  >a[0].iCursor );
121f0 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65    /* Not a corre
12200 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
12210 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  /.  }.  return p
12220 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12230 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12240 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
12250 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
12260 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
12270 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65  te code that che
12280 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  cks the left-mos
12290 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  t column of inde
122a0 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20  x table iCur to 
122b0 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e  see if.** it con
122c0 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65  tains any NULL e
122d0 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74  ntries.  Cause t
122e0 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72  he register at r
122f0 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20  egHasNull to be 
12300 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  set.** to a non-
12310 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43  NULL value if iC
12320 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ur contains no N
12330 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67  ULLs.  Cause reg
12340 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c  ister regHasNull
12350 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f  .** to be set to
12360 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f   NULL if iCur co
12370 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
12380 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
12390 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
123a0 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
123b0 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e  Flag(Vdbe *v, in
123c0 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48  t iCur, int regH
123d0 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61  asNull){.  int a
123e0 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr1;.  sqlite3V
123f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12400 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
12410 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31  asNull);.  addr1
12420 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12430 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
12440 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
12450 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
12460 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12470 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
12480 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
12490 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
124a0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
124b0 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
124c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
124d0 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
124e0 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
124f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12500 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
12510 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
12520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12530 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
12540 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
12550 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
12560 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  h a list (not a 
12570 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65  subquery) on the
12580 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
12590 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  side.  Return TR
125a0 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20  UE if that list 
125b0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a  is constant..*/.
125c0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
125d0 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
125e0 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  t(Expr *pIn){.  
125f0 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e  Expr *pLHS;.  in
12600 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
12610 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
12620 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c  y(pIn, EP_xIsSel
12630 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d  ect) );.  pLHS =
12640 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70   pIn->pLeft;.  p
12650 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  In->pLeft = 0;. 
12660 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78   res = sqlite3Ex
12670 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e  prIsConstant(pIn
12680 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  );.  pIn->pLeft 
12690 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e  = pLHS;.  return
126a0 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   res;.}.#endif..
126b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
126c0 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
126d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
126e0 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
126f0 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
12700 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
12710 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
12720 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
12730 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
12740 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
12750 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
12760 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
12770 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
12780 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
12790 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
127a0 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
127b0 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
127c0 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
127d0 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
127e0 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
127f0 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
12800 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
12810 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
12820 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
12830 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
12840 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
12850 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
12860 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
12870 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
12880 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  is the RHS of th
12890 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
128a0 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20   and pX->iTable 
128b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
128c0 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73  dex of that curs
128d0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  or..**.** The re
128e0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20  turned value of 
128f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
12900 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72  dicates the b-tr
12910 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  ee type, as foll
12920 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
12930 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20  INDEX_ROWID     
12940 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12950 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
12960 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
12970 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
12980 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72  X_ASC  - The cur
12990 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
129a0 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
129b0 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
129c0 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d  DEX_INDEX_DESC -
129d0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
129e0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63  opened on a desc
129f0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
12a00 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
12a10 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72         - The cur
12a20 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
12a30 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
12a40 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
12a70 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
12a80 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  **   IN_INDEX_NO
12a90 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75  OP       - No cu
12aa0 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74  rsor was allocat
12ab0 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  ed.  The IN oper
12ac0 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  ator must be.** 
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e          implemen
12af0 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63  ted as a sequenc
12b00 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
12b10 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
12b20 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74  ing b-tree might
12b30 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
12b40 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70  RHS expression p
12b50 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  X is a simple.**
12b60 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61   subquery such a
12b70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
12b80 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c  ECT <column1>, <
12b90 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d  column2>... FROM
12ba0 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
12bb0 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
12bc0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
12bd0 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
12be0 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
12bf0 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
12c00 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
12c10 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
12c20 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
12c30 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
12c40 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
12c50 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
12c60 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
12c70 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
12c80 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
12c90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
12ca0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
12cb0 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20  ust contain, at 
12cc0 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f  a minimum, one o
12cd0 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
12ce0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
12cf0 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
12d00 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e  OP but not both.
12d10 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
12d20 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
12d30 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
12d40 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
12d50 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
12d60 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a  sed for a fast.*
12d70 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  * membership tes
12d80 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
12d90 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
12da0 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e  s set, the IN in
12db0 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75  dex will.** be u
12dc0 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
12dd0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
12de0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12df0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
12e00 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
12e10 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
12e20 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
12e30 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
12e40 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
12e50 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
12e60 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
12e70 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
12e80 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
12e90 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
12ea0 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  le will be creat
12eb0 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
12ec0 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  lected columns a
12ed0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  re guaranteed.**
12ee0 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
12ef0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
12f00 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
12f10 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64  PRIMARY KEY or d
12f20 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55  ue to.** a UNIQU
12f30 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
12f40 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  index..**.** Whe
12f50 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  n IN_INDEX_MEMBE
12f60 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61  RSHIP is used (a
12f70 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
12f80 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
12f90 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
12fa0 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68  ership tests) th
12fb0 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  en an epheremal 
12fc0 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
12fd0 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
12fe0 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e  olumns> is a sin
12ff0 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gle INTEGER PRIM
13000 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
13010 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63  r an .** index c
13020 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  an be found with
13030 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c   the specified <
13040 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20  columns> as its 
13050 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a  left-most..**.**
13060 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58   If the IN_INDEX
13070 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f  _NOOP_OK and IN_
13080 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
13090 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e   are both set an
130a0 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20  d.** if the RHS 
130b0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
130c0 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f  or is a list (no
130d0 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68  t a subquery) th
130e0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
130f0 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20  ne might decide 
13100 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e  that creating an
13110 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65   ephemeral b-tre
13120 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  e for membership
13130 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74  .** testing is t
13140 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64  oo expensive and
13150 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
13160 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20  _NOOP.  In that 
13170 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c  case, the.** cal
13180 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f  ling routine sho
13190 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  uld implement th
131a0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73  e IN operator us
131b0 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a  ing a sequence.*
131c0 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f  * of Eq or Ne co
131d0 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
131e0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ons..**.** When 
131f0 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
13200 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
13210 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
13220 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
13230 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65  ion.** might nee
13240 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  d to know whethe
13250 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53  r or not the RHS
13260 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
13270 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74  operator.** cont
13280 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66  ains a NULL.  If
13290 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73   prRhsHasNull is
132a0 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   not a NULL poin
132b0 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74  ter and .** if t
132c0 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e  here is any chan
132d0 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
132e0 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  ) might contain 
132f0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a  a NULL value at.
13300 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  ** runtime, then
13310 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
13320 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
13330 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
13340 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a   written.** to *
13350 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66  prRhsHasNull. If
13360 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
13370 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
13380 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
13390 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
133a0 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  n *prRhsHasNull 
133b0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
133c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
133d0 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
133e0 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
133f0 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
13400 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68  prRhsHasNull, th
13410 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
13420 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
13430 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
13440 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
13450 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
13460 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  .** NULL values,
13470 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20   and it will be 
13480 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  some non-NULL va
13490 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65  lue if the b-tre
134a0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a  e contains no.**
134b0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
134c0 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70  .** If the aiMap
134d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
134e0 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20  t NULL, it must 
134f0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
13500 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  y containing.** 
13510 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  one element for 
13520 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  each column retu
13530 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
13540 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
13550 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68  the RHS.** of th
13560 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  e IN(...) operat
13570 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74  or. The i'th ent
13580 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ry of the array 
13590 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
135a0 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20  h the.** offset 
135b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
135c0 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  umn that matches
135d0 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
135e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
135f0 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20  .** SELECT. For 
13600 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
13610 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
13620 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72  elected index ar
13630 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c  e:.**.**   (?,?,
13640 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c  ?) IN (SELECT a,
13650 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a   b, c FROM t1).*
13660 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
13670 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20   i1 ON t1(b, c, 
13680 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61  a);.**.** then a
13690 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61  iMap[] is popula
136a0 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20  ted with {2, 0, 
136b0 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  1}..*/.#ifndef S
136c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
136d0 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
136e0 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61  indInIndex(.  Pa
136f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13700 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
13710 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13720 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20   Expr *pX,      
13730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13740 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
13750 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20  de (RHS) of the 
13760 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
13770 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
13780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13790 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
137a0 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
137b0 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
137c0 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
137d0 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
137e0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
137f0 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
13800 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
13810 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20  *aiMap          
13820 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
13830 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
13840 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
13850 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
13860 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  /* SELECT to the
13890 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65   right of IN ope
138a0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65  rator */.  int e
138b0 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Type = 0;       
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20   /* Type of RHS 
138e0 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f  table. IN_INDEX_
138f0 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  * */.  int iTab 
13900 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13910 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13920 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48  Cursor of the RH
13930 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  S table */.  int
13940 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20   mustBeUnique;  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13960 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48     /* True if RH
13970 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  S must be unique
13980 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
13990 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
139a0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56  Parse);     /* V
139b0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
139c0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20  eing coded */.. 
139d0 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
139e0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74  =TK_IN );.  must
139f0 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c  BeUnique = (inFl
13a00 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
13a10 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49  OOP)!=0;..  /* I
13a20 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69  f the RHS of thi
13a30 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
13a40 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20  or is a SELECT, 
13a50 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72  and if it matter
13a60 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  s .  ** whether 
13a70 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43  or not the SELEC
13a80 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  T result contain
13a90 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63  s NULL values, c
13aa0 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a  heck whether.  *
13ab0 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73  * or not NULL is
13ac0 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
13ad0 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62  le (it may not b
13ae0 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  e, for example, 
13af0 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54  due .  ** to NOT
13b00 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13b10 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29  s in the schema)
13b20 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  . If no NULL val
13b30 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ues are possible
13b40 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73  ,.  ** set prRhs
13b50 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66  HasNull to 0 bef
13b60 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
13b70 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48   */.  if( prRhsH
13b80 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66  asNull && (pX->f
13b90 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
13ba0 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ect) ){.    int 
13bb0 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  i;.    ExprList 
13bc0 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e  *pEList = pX->x.
13bd0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
13be0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13bf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
13c00 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
13c10 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
13c20 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ull(pEList->a[i]
13c30 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b  .pExpr) ) break;
13c40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13c50 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ==pEList->nExpr 
13c60 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61  ){.      prRhsHa
13c70 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  sNull = 0;.    }
13c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
13c90 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
13ca0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
13cb0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
13cc0 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
13cd0 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
13ce0 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
13cf0 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
13d00 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
13d10 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
13d20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13d30 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73  rr==0 && (p = is
13d40 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
13d50 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20  t(pX))!=0 ){.   
13d60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
13d80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13d90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13da0 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
13db0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13dd0 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
13de0 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20  /.    i16 iDb;  
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e10 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72  Database idx for
13e20 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70   pTab */.    Exp
13e30 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
13e40 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
13e50 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73  nt nExpr = pELis
13e60 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61  t->nExpr;..    a
13e70 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13e80 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
13e90 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
13ea0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13eb0 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
13ec0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13ed0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
13ee0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
13ef0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13f00 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
13f10 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
13f20 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
13f30 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
13f40 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13f50 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
13f60 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
13f70 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  [0].pTab;..    /
13f80 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
13f90 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
13fa0 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
13fb0 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
13fc0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
13fd0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
13fe0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
13ff0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14000 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14010 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
14020 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
14030 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
14040 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
14050 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  ame);..    asser
14060 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  t(v);  /* sqlite
14070 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61  3GetVdbe() has a
14080 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69  lways been previ
14090 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a  ously called */.
140a0 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
140b0 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
140c0 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  .pExpr->iColumn<
140d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
140e0 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
140f0 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65  rowid FROM table
14100 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  )" case */.     
14110 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
14120 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14130 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20  , OP_Once);.    
14140 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
14150 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
14160 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
14170 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
14180 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
14190 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
141a0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
141b0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
141c0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
141d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  0,.            "
141e0 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45 41 52  USING ROWID SEAR
141f0 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73 20 46  CH ON TABLE %s F
14200 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c  OR IN-OPERATOR",
14210 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
14220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14230 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
14240 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
14250 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
14260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
14280 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
14290 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  /.      int affi
142a0 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20  nity_ok = 1;.   
142b0 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
142c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
142d0 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
142e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
142f0 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20   perform each . 
14300 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
14310 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
14320 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
14330 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  f each column in
14340 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
14350 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
14360 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
14370 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73  If it not, it is
14380 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
14390 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e  .      ** use an
143a0 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52  y index of the R
143b0 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  HS table.  */.  
143c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
143d0 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79  Expr && affinity
143e0 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _ok; i++){.     
143f0 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
14400 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
14410 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
14420 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
14430 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69   int iCol = pELi
14440 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
14450 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
14460 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73   char idxaff = s
14470 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
14480 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69  nAffinity(pTab,i
14490 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62  Col); /* RHS tab
144a0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  le */.        ch
144b0 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69  ar cmpaff = sqli
144c0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
144d0 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29  ty(pLhs, idxaff)
144e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
144f0 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
14500 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
14510 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14520 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
14530 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
14540 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61      switch( cmpa
14550 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
14560 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
14570 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20  BLOB:.          
14580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14590 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
145a0 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20  FF_TEXT:.       
145b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43       /* sqlite3C
145c0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29  ompareAffinity()
145d0 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45   only returns TE
145e0 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f  XT if one side o
145f0 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  r the.          
14600 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e    ** other has n
14610 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74  o affinity and t
14620 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73  he other side is
14630 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20   TEXT.  Hence,. 
14640 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
14650 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63  e only way for c
14660 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  mpaff to be TEXT
14670 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74   is for idxaff t
14680 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20  o be TEXT.      
14690 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72        ** and for
146a0 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65   the term on the
146b0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74   LHS of the IN t
146c0 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69  o have no affini
146d0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ty. */.         
146e0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66     assert( idxaf
146f0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
14700 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  XT );.          
14710 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14720 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
14730 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
14740 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  _ok = sqlite3IsN
14750 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
14760 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
14770 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
14780 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b   if( affinity_ok
14790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
147a0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
147b0 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  sting index that
147c0 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74   will work for t
147d0 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
147e0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  */.        for(p
147f0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
14800 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
14810 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  =0; pIdx=pIdx->p
14820 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
14830 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64   Bitmask colUsed
14840 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ;      /* Column
14850 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75  s of the index u
14860 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  sed */.         
14870 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20   Bitmask mCol;  
14880 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66         /* Mask f
14890 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  or the current c
148a0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20  olumn */.       
148b0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
148c0 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e  lumn<nExpr ) con
148d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
148e0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c   /* Maximum nCol
148f0 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f  umn is BMS-2, no
14900 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74  t BMS-1, so that
14910 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a   we can compute.
14920 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54            ** BIT
14930 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68  MASK(nExpr) with
14940 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20  out overflowing 
14950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
14960 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
14970 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  lumn==BMS-2 );. 
14980 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14990 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
149a0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
149b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
149c0 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20  Column>=BMS-1 ) 
149d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
149e0 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e      if( mustBeUn
149f0 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ique ){.        
14a00 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
14a10 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20  eyCol>nExpr.    
14a20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78           ||(pIdx
14a30 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20  ->nColumn>nExpr 
14a40 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  && !IsUniqueInde
14a50 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20  x(pIdx)).       
14a60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14a70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
14a80 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
14a90 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65  s not unique ove
14aa0 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c  r the IN RHS col
14ab0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
14ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14ad0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63  }.  .          c
14ae0 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a  olUsed = 0;   /*
14af0 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65   Columns of inde
14b00 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  x used so far */
14b10 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
14b20 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
14b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
14b40 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14b50 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14b60 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14b70 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
14b80 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
14b90 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ;.            Co
14bb0 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
14bc0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
14bd0 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
14be0 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20  , pLhs, pRhs);. 
14bf0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
14c00 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14c10 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30   assert( pReq!=0
14c20 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d   || pRhs->iColum
14c30 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70  n==XN_ROWID || p
14c40 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20  Parse->nErr );. 
14c50 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
14c60 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b  =0; j<nExpr; j++
14c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14c80 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
14c90 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43  umn[j]!=pRhs->iC
14ca0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
14cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14cc0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
14cd0 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
14ce0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
14cf0 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  q!=0 && sqlite3S
14d00 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61  trICmp(pReq->zNa
14d10 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
14d20 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [j])!=0 ){.     
14d30 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
14d40 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
14d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d80 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
14d90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14da0 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53        mCol = MAS
14db0 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20  KBIT(j);.       
14dc0 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20       if( mCol & 
14dd0 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b  colUsed ) break;
14de0 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20   /* Each column 
14df0 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  used only once *
14e00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  /.            co
14e10 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20  lUsed |= mCol;. 
14e20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14e30 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20  iMap ) aiMap[i] 
14e40 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = j;.          }
14e50 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73  .  .          as
14e60 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c  sert( i==nExpr |
14e70 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b  | colUsed!=(MASK
14e80 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b  BIT(nExpr)-1) );
14e90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
14ea0 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54  olUsed==(MASKBIT
14eb0 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20  (nExpr)-1) ){.  
14ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14ed0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
14ee0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
14ef0 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69  the index pIdx i
14f00 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20  s usable */.    
14f10 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
14f20 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14f30 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
14f40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14f50 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
14f60 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
14f70 28 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  ((pParse, 0,.   
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49 4e             "USIN
14fa0 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49  G INDEX %s FOR I
14fb0 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78  N-OPERATOR",pIdx
14fc0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
14fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14fe0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
14ff0 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
15000 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
15010 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15020 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
15030 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
15040 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
15050 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15060 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
15070 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
15080 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
15090 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
150a0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
150b0 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
150c0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
150d0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
150e0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
150f0 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20  r[0];.  .       
15100 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
15110 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20  sNull ){.#ifdef 
15120 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
15130 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34               i64
15150 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
15160 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
15170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15180 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
15190 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a  iTab, 0, 0, (u8*
151c0 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34  )&mask, P4_INT64
151d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
151e0 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
151f0 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
15200 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
15210 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
15220 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
15230 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
15240 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
15250 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
15260 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
15270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15280 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
15290 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
152a0 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
152b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
152c0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
152d0 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
152e0 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
152f0 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
15300 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
15310 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
15320 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
15330 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
15340 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
15350 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
15360 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
15370 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
15380 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
15390 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
153a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
153b0 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
153c0 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
153d0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
153e0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
153f0 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
15400 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
15410 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
15420 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
15430 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
15440 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
15450 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
15460 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
15470 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
15480 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
15490 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
154a0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
154b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
154c0 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
154d0 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
154e0 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
154f0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
15500 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
15510 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
15520 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
15530 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
15540 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
15550 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
15560 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
15570 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
15580 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
15590 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
155a0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
155b0 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
155c0 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
155d0 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
155e0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
155f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
15600 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
15610 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
15620 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
15630 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
15640 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
15650 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
15660 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15670 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
15680 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15690 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
156a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
156b0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
156c0 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
156d0 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
156e0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
156f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
15700 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
15710 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
15720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15730 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
15740 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
15750 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
15760 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
15770 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
15780 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15790 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
157a0 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
157b0 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
157c0 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
157d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
157e0 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
157f0 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
15800 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
15810 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
15820 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
15830 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
15840 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
15850 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
15860 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
15870 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
15880 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
15890 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
158a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
158b0 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
158c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
158d0 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
158e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
158f0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
15900 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70  ** Argument pExp
15910 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e  r is an (?, ?...
15920 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  ) IN(...) expres
15930 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66  sion. This .** f
15940 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
15950 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
15960 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
15970 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
15980 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74   .** the affinit
15990 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66  ies to be used f
159a0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
159b0 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
159c0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
159d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
159e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
159f0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
15a00 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74  e returned.** st
15a10 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c  ring is eventual
15a20 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  ly freed using s
15a30 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
15a40 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
15a50 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50  exprINAffinity(P
15a60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15a70 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
15a80 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15a90 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
15aa0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
15ab0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
15ac0 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ft);.  Select *p
15ad0 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d  Select = (pExpr-
15ae0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
15af0 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
15b00 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
15b10 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
15b20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
15b30 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
15b40 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
15b50 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
15b60 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
15b70 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
15b80 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
15b90 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
15ba0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
15bb0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
15bc0 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
15bd0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
15be0 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
15bf0 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
15c00 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
15c10 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
15c20 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
15c30 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
15c40 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
15c50 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
15c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c70 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
15c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15c90 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
15ca0 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
15cb0 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
15cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15cd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15ce0 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
15cf0 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
15d00 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
15d10 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
15d20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
15d30 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
15d40 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
15d50 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
15d60 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
15d70 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
15d80 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
15d90 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
15da0 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
15db0 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
15dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
15dd0 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
15de0 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
15df0 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
15e00 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
15e10 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
15e20 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
15e30 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
15e40 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
15e50 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
15e60 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
15e70 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
15e80 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
15e90 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
15ea0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
15eb0 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
15ec0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
15ed0 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
15ee0 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
15ef0 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
15f00 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
15f10 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
15f20 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
15f30 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
15f40 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
15f50 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
15f60 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
15f70 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
15f80 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
15f90 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
15fa0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
15fb0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
15fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15fd0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
15fe0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
15ff0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
16000 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73  .    sqlite3Subs
16010 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
16020 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
16030 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
16040 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  pr, 1);.  }else.
16050 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
16060 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16070 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
16080 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d  e misused");.  }
16090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
160a0 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
160b0 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
160c0 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
160d0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
160e0 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
160f0 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
16100 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
16110 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
16120 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
16130 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
16140 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
16150 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
16160 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
16170 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
16180 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
16190 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
161a0 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
161b0 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
161c0 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
161d0 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
161e0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
161f0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
16200 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
16210 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
16220 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
16230 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
16240 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
16250 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
16260 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
16270 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
16280 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
16290 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
162a0 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
162b0 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
162c0 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
162d0 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
162e0 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
162f0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
16300 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
16310 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
16320 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
16330 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
16340 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
16350 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
16360 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
16370 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
16380 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
16390 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
163a0 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
163b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
163c0 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
163d0 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
163e0 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
163f0 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
16400 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
16410 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
16420 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
16430 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
16440 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
16450 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
16460 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
16470 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
16480 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
16490 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
164a0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
164b0 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
164c0 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
164d0 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
164e0 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
164f0 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
16500 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
16510 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
16520 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
16530 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
16540 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
16550 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69  lt.  For a multi
16560 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20  -column SELECT, 
16570 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
16580 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
16590 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
165a0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
165b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
165c0 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
165d0 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
165e0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
165f0 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72  n.  Return 0 for
16600 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
16610 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
16620 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  urs..*/.#ifndef 
16630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16640 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
16650 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
16660 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16670 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
16680 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16690 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
166a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
166b0 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
166c0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
166d0 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
166e0 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
166f0 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
16700 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
16710 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
16720 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16740 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
16750 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
16760 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
16770 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
16780 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
16790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
167a0 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
167b0 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
167c0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
167f0 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
16800 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
16810 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16820 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
16830 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
16840 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76   0;..  /* The ev
16850 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
16860 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54  IN/EXISTS/SELECT
16870 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65   must be repeate
16880 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a  d every time it.
16890 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
168a0 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  red if any of th
168b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
168c0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
168d0 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
168e0 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
168f0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
16900 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
16910 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16920 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
16930 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
16940 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
16950 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
16960 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
16970 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
16980 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
16990 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
169a0 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
169b0 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
169c0 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
169d0 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
169e0 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
169f0 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
16a00 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
16a10 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
16a20 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
16a30 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
16a40 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
16a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
16a60 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
16a70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16a80 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
16a90 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
16aa0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
16ab0 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ad0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
16ae0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
16af0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
16b00 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
16b10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f   pExpr->pLeft; /
16b20 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * the LHS of the
16b30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
16b40 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
16b50 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
16b60 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
16b70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
16b80 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  t nVal;         
16b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16ba0 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66  e of vector pLef
16bb0 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20  t */.      .    
16bc0 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    nVal = sqlite3
16bd0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16be0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
16bf0 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c  ert( !isRowid ||
16c00 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20   nVal==1 );..   
16c10 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
16c20 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
16c30 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
16c40 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
16c50 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
16c60 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
16c70 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
16c80 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
16c90 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
16ca0 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
16cb0 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
16cc0 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
16cd0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  ults from the . 
16ce0 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f       ** SELECT o
16cf0 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
16d00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16d10 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
16d20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
16d30 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
16d40 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
16d50 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
16d60 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
16d70 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
16d80 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
16d90 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
16da0 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
16db0 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
16dc0 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
16dd0 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
16de0 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
16df0 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
16e00 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
16e10 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
16e20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
16e30 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
16e40 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
16e50 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
16e60 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
16e70 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
16e80 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
16e90 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16ea0 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16eb0 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
16ec0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
16ed0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
16ee0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16ef0 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
16f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f10 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16f20 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20  meral, .        
16f30 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
16f40 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c   (isRowid?0:nVal
16f50 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ));.      pKeyIn
16f60 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30  fo = isRowid ? 0
16f70 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   : sqlite3KeyInf
16f80 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
16f90 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20  b, nVal, 1);..  
16fa0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
16fb0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16fc0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
16fd0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
16fe0 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
16ff0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
17000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
17010 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17020 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
17030 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
17040 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
17050 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
17060 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
17070 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
17080 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
17090 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
170a0 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78  elect = pExpr->x
170b0 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
170c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
170d0 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
170e0 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 45  List;..        E
170f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
17100 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 4c  (pParse, 1, "%sL
17110 49 53 54 20 53 55 42 51 55 45 52 59 22 2c 0a 20  IST SUBQUERY",. 
17120 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
17130 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
17140 4f 52 52 45 4c 41 54 45 44 20 22 0a 20 20 20 20  ORRELATED ".    
17150 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20      ));.        
17160 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
17170 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   );.        /* I
17180 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
17190 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
171a0 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
171b0 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  h, that.        
171c0 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61  ** error will ha
171d0 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c  ve been caught l
171e0 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65  ong before we re
171f0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
17200 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  */.        if( A
17210 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
17220 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
17230 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17240 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
17250 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17260 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
17270 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
17280 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
17290 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
172a0 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
172b0 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
172c0 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
172d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  );.          pSe
172e0 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
172f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
17300 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73  case( pSelect->s
17310 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17320 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
17330 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
17340 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
17350 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
17360 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
17370 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
17380 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
17390 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
173a0 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
173b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
173c0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
173d0 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
173e0 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
173f0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
17400 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
17410 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17420 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
17430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
17440 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
17450 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
17460 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
17470 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
17480 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
17490 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
174a0 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
174b0 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
174c0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
174d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
174e0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
174f0 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
17500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
17510 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
17520 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
17530 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ) );.          f
17540 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
17550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
17560 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17570 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17580 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
17590 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65  .            pKe
175a0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
175b0 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
175c0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
175e0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
175f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20  ->a[i].pExpr.   
17600 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
17610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17620 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
17630 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
17640 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
17650 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
17660 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
17670 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
17680 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
17690 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
176a0 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
176b0 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
176c0 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
176d0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
176e0 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
176f0 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
17700 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
17710 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
17720 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
17730 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
17740 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
17750 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
17760 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
17770 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
17780 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
17790 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
177a0 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
177b0 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ty;            /
177c0 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
177d0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
177e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
177f0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
17800 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
17810 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17820 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17830 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17840 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
17850 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 20   r2, r3;.       
17860 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69   affinity = sqli
17870 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
17880 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
17890 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
178a0 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
178b0 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
178c0 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
178d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
178e0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
178f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
17900 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
17910 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
17920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
17930 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
17940 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
17950 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
17960 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
17970 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
17980 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
17990 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
179a0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
179b0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
179c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
179d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
179e0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
179f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17a00 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
17a10 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  wid ) sqlite3Vdb
17a20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
17a30 6f 62 2c 20 30 2c 20 72 32 2c 20 30 2c 20 22 22  ob, 0, r2, 0, ""
17a40 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
17a50 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
17a60 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
17a70 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
17a80 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
17a90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
17aa0 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
17ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
17ac0 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
17ad0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17ae0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
17af0 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
17b00 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
17b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
17b20 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
17b30 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
17b40 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
17b50 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
17b60 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
17b70 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
17b80 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
17b90 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
17ba0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
17bb0 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
17bc0 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
17bd0 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
17be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17bf0 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61     if( jmpIfDyna
17c00 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74  mic>=0 && !sqlit
17c10 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
17c20 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
17c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17c40 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
17c50 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
17c60 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
17c70 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20  Dynamic = -1;.  
17c80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17c90 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
17ca0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17cb0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
17cc0 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
17cd0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
17ce0 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71  f( isRowid && sq
17cf0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
17d00 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49  er(pE2, &iValToI
17d10 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ns) ){.         
17d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17d30 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
17d40 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  tInt, pExpr->iTa
17d50 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49  ble, r2, iValToI
17d60 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ns);.          }
17d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17d80 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
17d90 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
17da0 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
17db0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
17dc0 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
17dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17df0 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20  MustBeInt, r3,. 
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17e20 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17e30 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
17e40 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
17e50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17e60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17e80 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
17e90 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
17ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
17eb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
17ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17ed0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
17ee0 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32  ecord, r3, 1, r2
17ef0 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
17f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17f20 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
17f30 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
17f40 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
17f50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17f70 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17f80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17f90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
17fb0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17fc0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
17fd0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
17fe0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
17ff0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18000 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
18010 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
18020 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
18030 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
18040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
18050 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
18060 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
18070 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
18080 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
18090 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
180a0 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
180b0 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
180c0 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
180d0 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
180e0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
180f0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
18100 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
18110 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
18120 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
18130 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
18140 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
18150 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
18160 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
18170 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
18180 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
18190 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
181a0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
181b0 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
181c0 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
181d0 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
181e0 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
181f0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
18200 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
18210 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
18220 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
18230 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
18240 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
18250 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
18260 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
18270 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
18280 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
18290 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
182a0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
182b0 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
182c0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
182d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
182e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
182f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
18300 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
18310 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
18320 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18330 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
18340 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
18350 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
18360 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18390 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
183a0 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  e */.      Expr 
183b0 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  *pLimit;        
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78   /* New limit ex
183e0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20  pression */..   
183f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
18400 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
18410 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
18420 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
18430 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
18440 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18450 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
18460 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18470 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
18480 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
18490 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
184a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
184b0 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
184c0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
184d0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
184e0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
184f0 20 31 2c 20 22 25 73 53 43 41 4c 41 52 20 53 55   1, "%sSCALAR SU
18500 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20  BQUERY",.       
18510 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
18520 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
18530 54 45 44 20 22 29 29 3b 0a 20 20 20 20 20 20 6e  TED "));.      n
18540 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  Reg = pExpr->op=
18550 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65  =TK_SELECT ? pSe
18560 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
18570 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 1;.      sqli
18580 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
18590 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
185a0 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20  se->nMem+1);.   
185b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
185c0 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69  += nReg;.      i
185d0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
185e0 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
185f0 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
18600 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
18610 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
18620 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
18630 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d      dest.nSdst =
18640 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73   nReg;.        s
18650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18660 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18670 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
18680 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
18690 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
186a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
186b0 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
186c0 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
186d0 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
186e0 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
186f0 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
18700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18710 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18720 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
18730 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
18740 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
18750 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
18760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69       }.      pLi
18770 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
18780 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
18790 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73  b, TK_INTEGER,&s
187a0 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
187b0 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
187c0 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29  ( pSel->pLimit )
187d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
187e0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
187f0 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
18800 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  imit->pLeft);.  
18810 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
18820 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d  it->pLeft = pLim
18830 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
18840 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  .        pSel->p
18850 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
18860 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
18870 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30  LIMIT, pLimit, 0
18880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18890 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
188a0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
188b0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
188c0 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
188d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
188e0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
188f0 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
18900 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
18910 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
18920 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
18930 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
18940 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
18950 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  if( rHasNullFlag
18960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
18970 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
18980 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
18990 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20  rHasNullFlag);. 
189a0 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44   }..  if( jmpIfD
189b0 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20  ynamic>=0 ){.   
189c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
189d0 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Here(v, jmpIfDyn
189e0 61 6d 69 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  amic);.  }..  re
189f0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
18a00 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18a10 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
18a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18a30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18a40 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
18a50 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
18a60 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
18a70 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
18a80 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
18a90 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
18aa0 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
18ab0 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
18ac0 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
18ad0 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
18ae0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
18af0 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
18b00 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
18b10 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
18b20 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
18b30 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
18b40 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
18b50 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
18b60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18b70 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
18b80 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
18b90 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
18ba0 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
18bb0 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
18bc0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
18bd0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
18be0 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
18bf0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
18c00 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
18c10 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
18c20 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
18c30 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
18c40 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
18c50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18c60 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
18c70 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
18c80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
18c90 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
18ca0 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
18cb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
18cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18cd0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
18ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18cf0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
18d00 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18d10 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
18d20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
18d30 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
18d40 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
18d50 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
18d60 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
18d70 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
18d80 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
18d90 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
18da0 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
18db0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
18dc0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
18dd0 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
18de0 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
18df0 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
18e00 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
18e10 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
18e20 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18e30 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
18e40 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
18e50 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
18e60 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
18e70 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
18e80 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
18e90 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
18ea0 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
18eb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
18ec0 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
18ed0 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
18ee0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
18ef0 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
18f00 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
18f10 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18f20 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
18f30 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
18f40 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
18f50 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
18f60 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
18f70 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
18f80 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
18f90 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
18fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18fb0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
18fc0 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
18fd0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
18fe0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
18ff0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
19000 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
19010 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
19020 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
19030 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
19040 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
19050 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
19060 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
19070 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
19080 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
19090 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
190a0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
190b0 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
190c0 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
190d0 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
190e0 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
190f0 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
19100 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
19110 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
19120 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
19130 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
19140 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
19150 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19160 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19170 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
19180 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
19190 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
191a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
191b0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
191c0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
191d0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
191e0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
191f0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
19200 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
19210 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
19220 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19230 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
19240 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
19250 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
19260 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
19270 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
19280 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
19290 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
192a0 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
192b0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
192c0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
192d0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
192e0 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
192f0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
19300 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
19310 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
19320 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
19330 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
19340 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
19350 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
19360 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19380 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
19390 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
193a0 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
193b0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
193c0 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
193d0 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
193e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
193f0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
19400 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
19410 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
19420 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
19430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
19440 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
19450 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
19460 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
19470 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
19480 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
19490 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
194a0 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
194b0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
194c0 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
194d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
194e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
194f0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
19500 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
19510 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
19520 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
19530 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
19540 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
19550 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
19560 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
19570 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
19580 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
19590 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
195a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
195b0 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
195c0 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
195d0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
195e0 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
195f0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
19600 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
19610 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
19620 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
19630 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
19640 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
19650 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
19660 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
19670 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
19680 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
19690 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
196a0 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
196b0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
196c0 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
196d0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
196e0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
196f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19700 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
19710 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19720 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
19730 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
19740 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
19750 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
19760 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
19770 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19780 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
19790 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
197a0 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
197b0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
197c0 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
197d0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
197e0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
197f0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
19800 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
19810 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
19820 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
19830 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
19840 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
19850 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
19860 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
19870 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
19880 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
19890 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
198a0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
198b0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
198c0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
198d0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
198e0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
198f0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
19900 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
19910 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
19920 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
19930 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
19940 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
19950 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19970 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
19980 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
19990 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
199a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
199c0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
199d0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
199e0 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
199f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
19a00 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
19a10 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
19a20 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
19a30 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
19a40 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19a50 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
19a60 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
19a70 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
19a80 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
19a90 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
19aa0 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
19ab0 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
19ac0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
19ad0 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
19ae0 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
19af0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19b00 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
19b10 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
19b20 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
19b30 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
19b40 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
19b50 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
19b60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
19b70 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
19b80 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
19b90 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
19ba0 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
19bb0 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
19bc0 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
19bd0 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
19be0 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
19bf0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
19c00 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
19c10 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
19c20 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
19c30 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
19c40 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
19c50 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
19c60 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
19c70 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
19c80 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
19c90 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
19ca0 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
19cb0 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
19cc0 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
19cd0 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
19ce0 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
19cf0 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
19d00 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
19d10 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
19d20 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72  x..  */.  rLhsOr
19d30 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
19d40 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
19d50 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
19d60 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19d70 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
19d80 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
19d90 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
19da0 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
19db0 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
19dc0 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
19dd0 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
19de0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
19df0 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
19e00 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
19e10 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
19e20 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
19e30 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
19e40 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
19e50 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
19e60 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
19e70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
19e80 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
19e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ea0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
19eb0 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
19ec0 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
19ed0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19ee0 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
19ef0 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
19f00 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
19f10 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
19f20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
19f30 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
19f40 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
19f50 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
19f60 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
19f70 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
19f80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
19f90 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
19fa0 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
19fb0 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
19fc0 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
19fd0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19fe0 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
19ff0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1a000 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1a010 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1a020 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1a030 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1a040 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1a050 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
1a060 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a070 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
1a080 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
1a090 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
1a0a0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
1a0b0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
1a0c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1a0d0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1a0e0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
1a0f0 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
1a100 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1a110 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
1a120 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1a130 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1a140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a150 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
1a160 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
1a170 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
1a180 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1a190 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
1a1a0 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
1a1b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1a1c0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
1a1d0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
1a1e0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
1a1f0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1a200 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1a210 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
1a220 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
1a230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a240 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1a250 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
1a260 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
1a270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a280 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
1a290 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
1a2a0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1a2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a2c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a2d0 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
1a2e0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1a310 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1a320 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1a330 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
1a340 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
1a350 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1a360 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
1a370 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1a380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a390 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1a3a0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1a3b0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1a3c0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
1a3d0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
1a3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a3f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1a400 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
1a410 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a430 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1a440 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
1a450 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a470 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1a480 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
1a490 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1a4a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1a4b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a4c0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
1a4d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1a4e0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
1a4f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a500 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1a510 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
1a520 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
1a530 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1a550 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1a560 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
1a570 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a580 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
1a590 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1a5a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a5b0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1a5c0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1a5d0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1a5e0 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1a5f0 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1a600 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1a610 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1a620 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1a630 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1a640 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1a650 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a660 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1a670 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1a680 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1a690 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1a6a0 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1a6b0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1a6c0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1a6d0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1a6e0 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1a6f0 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1a700 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1a710 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1a720 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a730 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
1a740 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1a750 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
1a760 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
1a770 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
1a780 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
1a790 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1a7a0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
1a7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a7c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1a7d0 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
1a7e0 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
1a7f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a810 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
1a820 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
1a830 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
1a840 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
1a850 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
1a860 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
1a870 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
1a880 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
1a890 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
1a8a0 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
1a8b0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
1a8c0 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
1a8d0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1a8e0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
1a8f0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
1a900 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
1a910 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
1a920 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
1a930 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
1a940 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
1a950 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
1a960 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
1a970 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
1a980 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a990 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
1a9a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1a9b0 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
1a9c0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1a9d0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
1a9e0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a9f0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1aa00 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
1aa10 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
1aa20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
1aa30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1aa40 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
1aa50 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
1aa60 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1aa70 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1aa80 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
1aa90 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
1aaa0 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
1aab0 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
1aac0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
1aad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aae0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1aaf0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1ab00 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1ab10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1ab30 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1ab40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ab50 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1ab60 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1ab70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1ab80 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1ab90 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1aba0 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1abb0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1abc0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1abd0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1abe0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1abf0 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
1ac00 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1ac40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ac50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1ac60 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
1ac70 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
1ac80 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
1ac90 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
1aca0 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
1acb0 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
1acc0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1acd0 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
1ace0 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
1acf0 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
1ad00 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1ad10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ad20 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
1ad30 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
1ad40 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
1ad50 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1ad60 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
1ad70 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1ad80 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
1ad90 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
1ada0 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
1adb0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1adc0 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
1add0 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
1ade0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
1adf0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1ae00 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1ae10 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
1ae20 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
1ae30 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
1ae40 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
1ae50 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
1ae60 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
1ae70 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1ae80 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
1ae90 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
1aea0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
1aeb0 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
1aec0 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
1aed0 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
1aee0 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
1aef0 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
1af00 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
1af10 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
1af20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
1af30 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
1af40 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
1af50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1af60 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
1af70 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
1af80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1af90 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
1afa0 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1afb0 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1afc0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1afd0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1afe0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1aff0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b000 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
1b010 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1b020 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1b030 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1b040 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1b050 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1b060 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1b070 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1b080 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1b090 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1b0a0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1b0b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1b0c0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1b0d0 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1b0e0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1b0f0 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1b100 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1b110 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1b120 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1b130 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1b140 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1b150 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1b160 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1b170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b180 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1b190 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1b1a0 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1b1b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b1c0 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1b1d0 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1b200 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1b210 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b220 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b230 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1b240 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1b250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b260 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1b270 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1b280 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1b290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1b2a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b2b0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1b2c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b2d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1b2e0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1b2f0 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1b300 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b310 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1b320 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1b330 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1b340 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1b350 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1b360 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1b370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b380 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1b390 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1b3a0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1b3b0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1b3c0 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1b3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b3e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1b3f0 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1b400 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1b410 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1b420 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1b430 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b440 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1b450 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b460 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
1b470 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
1b480 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
1b490 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b4a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
1b4b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
1b4c0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1b4d0 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
1b4e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1b4f0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
1b500 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b510 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
1b520 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1b530 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1b540 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
1b550 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1b560 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
1b570 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
1b580 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1b590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
1b5a0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
1b5b0 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
1b5c0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
1b5d0 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
1b5e0 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
1b5f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
1b600 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
1b610 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
1b620 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
1b630 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
1b640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b650 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
1b660 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
1b670 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
1b680 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
1b690 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
1b6a0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
1b6b0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1b6c0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
1b6d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b6e0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1b6f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
1b700 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
1b710 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
1b720 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
1b730 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
1b740 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
1b750 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
1b760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b770 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1b780 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
1b790 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1b7a0 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
1b7b0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
1b7c0 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1b7d0 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1b7e0 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
1b7f0 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
1b800 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
1b810 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1b820 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
1b830 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
1b840 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
1b850 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
1b860 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
1b870 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
1b880 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1b890 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
1b8a0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
1b8b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1b8c0 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
1b8d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1b8e0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
1b8f0 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
1b900 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
1b910 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
1b920 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
1b930 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
1b940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1b950 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
1b960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b970 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
1b980 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
1b990 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
1b9a0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
1b9b0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1b9c0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
1b9d0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1b9e0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28  alue);.    if( (
1b9f0 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67  c==3 && !negFlag
1ba00 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28  ) || (c==2) || (
1ba10 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65  negFlag && value
1ba20 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1ba30 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  )){.#ifdef SQLIT
1ba40 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1ba50 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
1ba60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ba70 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
1ba80 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
1ba90 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
1baa0 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
1bab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bac0 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
1bad0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1bae0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
1baf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bb00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1bb10 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
1bb20 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
1bb30 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22  %s", negFlag?"-"
1bb40 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65  :"",z);.      }e
1bb50 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1bb60 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
1bb70 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
1bb80 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
1bb90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1bba0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  se{.      if( ne
1bbb0 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
1bbc0 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54   c==3 ? SMALLEST
1bbd0 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
1bbe0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1bbf0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1bc00 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
1bc10 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1bc20 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
1bc30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1bc40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1bc50 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e  hat will load in
1bc60 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f  to register regO
1bc70 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ut a value that 
1bc80 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  is.** appropriat
1bc90 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f  e for the iIdxCo
1bca0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
1bcb0 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f  ndex pIdx..*/.vo
1bcc0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1bcd0 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
1bce0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1bcf0 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73  se,  /* The pars
1bd00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1bd10 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
1bd20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
1bd30 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f  ose column is to
1bd40 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1bd50 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1bd60 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1bd70 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f  ng to a table ro
1bd80 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  w */.  int iIdxC
1bd90 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ol,    /* The co
1bda0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1bdb0 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  x to be loaded *
1bdc0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1bdd0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
1bde0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61   index column va
1bdf0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
1be00 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36  ster */.){.  i16
1be10 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d   iTabCol = pIdx-
1be20 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f  >aiColumn[iIdxCo
1be30 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f  l];.  if( iTabCo
1be40 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  l==XN_EXPR ){.  
1be50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1be60 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20  aColExpr );.    
1be70 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1be80 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49  olExpr->nExpr>iI
1be90 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61  dxCol );.    pPa
1bea0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
1beb0 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20  iTabCur + 1;.   
1bec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bed0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1bee0 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1bef0 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1bf00 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72  egOut);.    pPar
1bf10 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
1bf20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1bf30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1bf40 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70  tColumnOfTable(p
1bf50 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49  Parse->pVdbe, pI
1bf60 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62  dx->pTable, iTab
1bf70 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c           iTabCol
1bfa0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1bfb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1bfc0 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
1bfd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1bfe0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
1bff0 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
1c000 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c010 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c020 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
1c030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1c040 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
1c050 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
1c060 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
1c070 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
1c080 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
1c090 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c0a0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1c0b0 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20  cursor.  Or the 
1c0c0 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49  PK cursor for WI
1c0d0 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
1c0e0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
1c0f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1c100 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
1c110 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
1c120 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
1c130 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ct the value int
1c140 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
1c150 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62  */.){.  if( pTab
1c160 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c170 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c180 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43  OP_Column, iTabC
1c190 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ur, iCol, regOut
1c1a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c1b0 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20   }.  if( iCol<0 
1c1c0 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
1c1d0 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
1c1e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c1f0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
1c200 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
1c210 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
1c220 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
1c230 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
1c240 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
1c250 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
1c260 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1c270 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72  (pTab) && !IsVir
1c280 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1c290 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
1c2a0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
1c2b0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1c2c0 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
1c2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c2e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1c2f0 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
1c300 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
1c310 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1c320 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
1c330 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
1c340 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1c350 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1c360 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1c370 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
1c380 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
1c390 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
1c3a0 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
1c3b0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1c3c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1c3d0 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  g. .**.** There 
1c3e0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1c3f0 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
1c400 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
1c410 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
1c420 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
1c430 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
1c440 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
1c450 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
1c460 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
1c470 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1c480 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1c490 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1c4a0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1c4b0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1c4c0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1c4d0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1c4e0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1c4f0 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1c500 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1c510 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1c520 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1c530 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1c540 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1c550 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1c560 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1c570 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1c580 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
1c590 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1c5a0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
1c5b0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
1c5c0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
1c5d0 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20   + FLAGS */.){. 
1c5e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1c5f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1c600 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1c610 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1c620 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1c630 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1c640 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1c650 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1c660 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1c670 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20  P5(v, p5);.  }. 
1c680 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
1c690 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c6a0 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1c6b0 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1c6c0 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1c6d0 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1c6e0 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1c6f0 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g-1..*/.void sql
1c700 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1c710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c720 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1c730 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1c740 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1c750 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1c760 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1c770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c780 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1c790 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1c7a0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a  , iTo, nReg);.}.
1c7b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1c7c0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1c7d0 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1c7e0 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1c7f0 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1c800 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1c810 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1c820 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1c830 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1c840 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1c850 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1c860 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1c870 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1c880 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1c890 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1c8a0 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1c8b0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1c8c0 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1c8d0 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1c8e0 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1c8f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1c900 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1c910 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1c920 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1c930 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1c940 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1c950 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1c960 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1c970 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1c980 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1c990 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1c9a0 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1c9b0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1c9c0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1c9d0 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1c9e0 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1c9f0 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1ca00 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1ca10 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1ca20 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1ca30 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  If the retu
1ca40 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1ca50 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1ca60 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1ca70 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ca80 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1ca90 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1caa0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1cab0 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1cac0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1cad0 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1cae0 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1caf0 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1cb00 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1cb10 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1cb20 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1cb30 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1cb40 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1cb50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1cb60 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1cb70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb80 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1cb90 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1cba0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66  TK_SELECT ){.#if
1cbb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1cbc0 51 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73  QUERY.      iRes
1cbd0 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  ult = 0;.#else. 
1cbe0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1cbf0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1cc00 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30  ect(pParse, p, 0
1cc10 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1cc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1cc30 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1cc40 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1cc50 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1cc60 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1cc70 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1cc80 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1cc90 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1cca0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1ccb0 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1ccc0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1ccd0 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1cce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ccf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1cd00 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1cd10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1cd20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1cd30 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1cd40 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1cd50 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1cd60 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1cd70 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1cd80 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1cd90 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1cda0 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1cdb0 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1cdc0 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1cdd0 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1cde0 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1cdf0 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1ce00 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1ce10 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1ce20 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1ce30 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1ce40 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1ce50 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1ce60 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1ce70 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1ce80 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1ce90 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1cea0 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1ceb0 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1cec0 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1ced0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1cee0 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1cef0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1cf00 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1cf10 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1cf20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1cf30 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1cf40 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1cf50 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cf70 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1cf80 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1cf90 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1cfa0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1cfb0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1cfc0 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1cfd0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1cfe0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1cff0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1d000 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1d010 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1d020 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1d030 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1d040 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1d050 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1d060 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1d070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d080 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1d090 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1d0a0 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1d0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1d0c0 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1d0d0 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1d0e0 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1d0f0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1d100 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1d110 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1d120 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1d130 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1d140 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1d150 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1d160 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1d170 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1d180 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1d190 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1d1a0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1d1b0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1d1c0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1d1d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1d1e0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1d1f0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1d200 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1d210 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1d220 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1d230 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1d240 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1d250 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1d260 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1d270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d280 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1d290 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1d2a0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1d2b0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1d2c0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1d2d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1d2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d2f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1d300 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1d310 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1d340 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1d350 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1d360 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1d370 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1d380 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1d390 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1d3a0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1d3b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d3c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1d3d0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1d3e0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1d3f0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1d400 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
1d410 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
1d420 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65  /* This COLUMN e
1d430 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 61  xpression is rea
1d440 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20 64  lly a constant d
1d450 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75  ue to WHERE clau
1d460 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  se.        ** co
1d470 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
1d480 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  hat constant is 
1d490 63 6f 64 65 64 20 62 79 20 74 68 65 20 70 45 78  coded by the pEx
1d4a0 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
1d4b0 20 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f 6e    ** expresssion
1d4c0 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65  .  However, make
1d4d0 20 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74 61   sure the consta
1d4e0 6e 74 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  nt has the corre
1d4f0 63 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ct.        ** da
1d500 74 61 74 79 70 65 20 62 79 20 61 70 70 6c 79 69  tatype by applyi
1d510 6e 67 20 74 68 65 20 41 66 66 69 6e 69 74 79 20  ng the Affinity 
1d520 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1d530 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 20  umn to the.     
1d540 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a     ** constant..
1d550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d560 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73 71     int iReg = sq
1d570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d580 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1d590 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74 29  r->pLeft,target)
1d5a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 66  ;.        int af
1d5b0 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
1d5c0 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
1d5d0 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45  Expr->y.pTab, pE
1d5e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1d5f0 20 20 20 20 20 20 20 69 66 28 20 61 66 66 21 3d         if( aff!=
1d600 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
1d610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1d620 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1d630 41 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c  Aff[] = "B\000C\
1d640 30 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20  000D\000E";.    
1d650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1d660 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27  LITE_AFF_BLOB=='
1d670 41 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  A' );.          
1d680 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1d690 46 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a  FF_TEXT=='B' );.
1d6a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
1d6b0 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1d6c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d6d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d6e0 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74  P_SCopy, iReg, t
1d6f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1d700 20 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65      iReg = targe
1d710 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1d720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d730 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d740 5f 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c  _Affinity, iReg,
1d750 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42     &zAff[(aff-'B
1d780 27 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43  ')*2], P4_STATIC
1d790 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d7a0 20 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67       return iReg
1d7b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d7c0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1d7d0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1d7e0 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a  ->iSelfTab<0 ){.
1d7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1d800 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1d810 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1d820 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1d830 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1d840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1d850 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  xpr->iColumn - p
1d860 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1d870 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1d890 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1d8a0 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1d8b0 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1d8c0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1d8d0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1d8e0 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1d8f0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1d900 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1d910 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1d920 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1d930 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a  ->iSelfTab - 1;.
1d940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d950 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1d960 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1d970 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1d980 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20  pExpr->y.pTab,. 
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d9b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1d9c0 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d9f0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1da00 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1da10 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1da20 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1da30 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1da40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1da50 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1da60 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c   case TK_TRUEFAL
1da70 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1da80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1da90 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c   OP_Integer, sql
1daa0 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
1dab0 75 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65  ue(pExpr), targe
1dac0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1dad0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1dae0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1daf0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1db00 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1db10 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1db20 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1db30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1db40 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1db50 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1db60 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1db70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1db80 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1db90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1dba0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1dbb0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1dbc0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1dbd0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1dbe0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1dbf0 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1dc00 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1dc10 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1dc20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1dc30 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1dc40 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1dc50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1dc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dc70 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1dc80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1dc90 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1dca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dcb0 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1dcc0 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1dcd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1dce0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1dcf0 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1dd00 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1dd10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1dd20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1dd30 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1dd40 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1dd50 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1dd60 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1dd70 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1dd80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dd90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1dda0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1ddb0 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1ddc0 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1ddd0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1dde0 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1ddf0 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1de00 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1de10 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1de20 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1de30 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1de40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1de50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1de60 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1de70 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1de80 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1de90 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1dea0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1deb0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1dec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ded0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1dee0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1def0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1df00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1df10 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1df20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1df30 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1df40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1df50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1df60 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1df70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1df80 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1df90 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1dfa0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1dfb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1dfc0 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1dfd0 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1dfe0 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1dff0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1e000 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e010 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1e020 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1e030 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1e040 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1e050 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1e060 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1e070 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1e080 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1e090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e0a0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1e0b0 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1e0c0 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1e0d0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e0e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e0f0 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1e100 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1e110 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1e120 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e130 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1e140 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1e150 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1e160 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1e170 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1e180 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1e190 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1e1a0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1e1b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e1c0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1e1d0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1e1e0 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1e1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e200 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1e210 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1e220 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1e230 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1e240 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e250 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1e260 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1e290 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1e2a0 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1e2b0 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67      return inReg
1e2c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1e2d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1e2e0 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1e2f0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1e300 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f  K_ISNOT:.      o
1e310 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1e320 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1e330 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49  .      p5 = SQLI
1e340 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
1e350 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68   /* fall-through
1e360 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1e370 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1e380 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1e390 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1e3a0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1e3b0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1e3c0 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EQ: {.      Expr
1e3d0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1e3e0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66  >pLeft;.      if
1e3f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1e400 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a  ector(pLeft) ){.
1e410 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74          codeVect
1e420 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  orCompare(pParse
1e430 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1e440 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20   op, p5);.      
1e450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1e460 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e470 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e480 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e490 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1e4a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e4b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e4c0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e4d0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ree2);.        c
1e4e0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1e4f0 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  e, pLeft, pExpr-
1e500 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1e510 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1e520 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
1e530 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
1e540 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e550 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1e560 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1e570 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e580 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1e590 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e5a0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1e5b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1e5c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e5d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1e5e0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e5f0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1e600 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1e610 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e620 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1e630 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e640 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1e650 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1e660 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e670 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1e680 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e690 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1e6a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1e6b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e6c0 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1e6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e6e0 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
1e6f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
1e700 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e710 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
1e720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e730 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e740 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e750 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1e770 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e780 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
1e790 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
1e7a0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
1e7b0 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
1e7c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1e7d0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
1e7e0 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
1e7f0 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
1e800 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
1e810 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
1e820 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1e830 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
1e840 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
1e850 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
1e860 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
1e870 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
1e880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e890 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
1e8a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e8b0 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
1e8c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1e8d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
1e8e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e8f0 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
1e900 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
1e910 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
1e920 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1e930 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
1e940 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
1e950 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e960 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
1e970 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
1e980 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
1e990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e9a0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
1e9b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1e9c0 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
1e9d0 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1e9e0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
1e9f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ea00 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
1ea10 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
1ea20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ea30 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
1ea40 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
1ea50 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
1ea60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ea70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
1ea80 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1ea90 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
1eaa0 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
1eab0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
1eac0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ead0 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
1eae0 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
1eaf0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1eb00 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
1eb10 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
1eb20 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
1eb30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1eb40 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
1eb50 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1eb60 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1eb70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1eb80 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1eb90 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1eba0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ebb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ebc0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1ebd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ebe0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1ebf0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1ec00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ec10 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ec20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ec30 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1ec40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ec60 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1ec70 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1ec80 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1ec90 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1eca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1ecb0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
1ecc0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
1ecd0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1ece0 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
1ecf0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1ed00 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e  urn target;.#ifn
1ed10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ed20 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1ed30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ed40 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1ed50 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1ed60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ed70 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ed80 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ed90 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1eda0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1edb0 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 1, target);. 
1edc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1edd0 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rget;.#endif.   
1ede0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1edf0 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1ee00 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1ee10 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1ee20 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1ee30 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1ee40 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1ee50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1ee60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ee70 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1ee80 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1ee90 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1eea0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1eeb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1eec0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1eed0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1eee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1eef0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1ef00 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1ef10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ef20 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1ef30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1ef40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ef50 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1ef60 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1ef70 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1ef80 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1ef90 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1efa0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1efb0 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1efc0 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1efd0 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1efe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1eff0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1f000 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f010 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f020 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f030 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1f040 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f050 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f070 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1f080 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f0a0 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
1f0b0 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a  nt isTrue;    /*
1f0c0 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e   IS TRUE or IS N
1f0d0 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
1f0e0 20 69 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20   int bNormal;   
1f0f0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
1f100 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
1f110 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f120 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f130 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f140 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f150 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f160 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f170 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
1f180 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1f190 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1f1a0 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70       bNormal = p
1f1b0 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
1f1c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f1d0 28 20 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72  ( isTrue && bNor
1f1e0 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  mal);.      test
1f1f0 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
1f200 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1f210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f220 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72  p4Int(v, OP_IsTr
1f230 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21  ue, r1, inReg, !
1f240 69 73 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e  isTrue, isTrue ^
1f250 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1f260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f270 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1f280 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1f290 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
1f2a0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
1f2b0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
1f2c0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
1f2d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f2e0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1f2f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1f300 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
1f310 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
1f320 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1f330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1f350 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1f360 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f370 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f380 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f390 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f3a0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1f3b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f3c0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
1f3d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f3e0 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
1f3f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f400 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1f410 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1f420 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f430 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1f440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1f460 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
1f470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f480 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1f490 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
1f4a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f4b0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1f4c0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1f4d0 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
1f4e0 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1f4f0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
1f500 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f510 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f520 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f530 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f540 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1f550 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
1f560 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
1f570 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
1f580 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1f590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f5a0 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75  eturn pInfo->aFu
1f5b0 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
1f5c0 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
1f5d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f5e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
1f5f0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
1f600 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
1f610 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1f620 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1f630 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
1f640 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
1f650 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f660 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1f670 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
1f680 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
1f690 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
1f6a0 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
1f6b0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63  bject */.      c
1f6c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
1f6d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
1f6e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1f6f0 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
1f700 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
1f710 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
1f720 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
1f730 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
1f740 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1f750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f760 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1f770 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1f780 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
1f790 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1f7a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
1f7b0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
1f7c0 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
1f7d0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
1f7e0 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
1f7f0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
1f800 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
1f810 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
1f820 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
1f830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f840 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
1f850 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1f860 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f870 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
1f880 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1f890 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65  Expr->y.pWin->re
1f8a0 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d  gResult;.      }
1f8b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1f8c0 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
1f8d0 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69  (pParse) && sqli
1f8e0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1f8f0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
1f900 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ){.        /* SQ
1f910 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
1f920 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f  be expensive. So
1f930 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e   try to move con
1f940 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a  stant functions.
1f950 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f          ** out o
1f960 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
1f970 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
1f980 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50  eans an extra OP
1f990 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20  _Copy. */.      
1f9a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f9b0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1f9c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
1f9d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f9e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f9f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1fa00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1fa10 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1fa20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1fa30 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
1fa40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
1fa50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
1fa60 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
1fa70 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
1fa80 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
1fa90 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
1faa0 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
1fab0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
1fac0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1fad0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1fae0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1faf0 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
1fb00 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
1fb10 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
1fb20 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
1fb30 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
1fb40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fb50 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
1fb60 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
1fb70 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
1fb80 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1fb90 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
1fba0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
1fbb0 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
1fbc0 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
1fbd0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
1fbe0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
1fbf0 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
1fc00 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
1fc10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1fc20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1fc30 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
1fc40 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
1fc50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fc60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1fc70 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
1fc80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1fc90 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
1fca0 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
1fcb0 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
1fcc0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
1fcd0 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
1fce0 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
1fcf0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
1fd00 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
1fd10 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
1fd20 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
1fd30 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
1fd40 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1fd50 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
1fd60 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
1fd70 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
1fd80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1fd90 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1fda0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
1fdb0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1fdc0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1fdd0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
1fde0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1fdf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1fe00 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
1fe10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fe20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fe30 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
1fe40 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
1fe50 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
1fe60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1fe70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fe80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1fe90 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
1fea0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1feb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1fec0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1fed0 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
1fee0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
1fef0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1ff00 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
1ff10 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
1ff20 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
1ff30 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
1ff40 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
1ff50 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1ff60 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1ff70 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1ff80 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1ff90 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
1ffa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ffb0 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
1ffc0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ffd0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1ffe0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1fff0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
20000 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69  et);.      }..#i
20010 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20020 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41  G.      /* The A
20030 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69  FFINITY() functi
20040 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
20050 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
20060 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a  scribes.      **
20070 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
20080 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ty of the argume
20090 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  nt.  This is use
200a0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66  d for testing of
200b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51  .      ** the SQ
200c0 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e  Lite type logic.
200d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
200e0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
200f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20100 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20  C_AFFINITY ){.  
20110 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20120 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62   *azAff[] = { "b
20130 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e  lob", "text", "n
20140 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65  umeric", "intege
20150 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20  r", "real" };.  
20160 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a        char aff;.
20170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20180 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
20190 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
201a0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46  3ExprAffinity(pF
201b0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
201c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
201d0 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
201e0 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20  v, target, .    
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20            aff ? 
20210 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45  azAff[aff-SQLITE
20220 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f  _AFF_BLOB] : "no
20230 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ne");.        re
20240 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20250 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20260 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
20270 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
20280 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
20290 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
202a0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
202b0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
202c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
202d0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
202e0 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
202f0 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
20300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20310 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20320 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20330 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
20340 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
20350 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
20360 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20370 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20380 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
203a0 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
203b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
203c0 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
203d0 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
203e0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
203f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20400 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
20410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20420 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20430 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
20440 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
20450 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20460 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
20470 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
20480 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
20490 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
204a0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
204b0 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
204c0 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
204d0 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
204e0 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
204f0 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
20500 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
20510 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
20520 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
20530 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
20540 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
20550 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20560 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20570 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
20580 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
20590 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
205a0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
205b0 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
205c0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
205d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
205e0 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
205f0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
20600 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
20610 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20620 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
20630 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
20640 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
20650 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
20660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
20670 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
20680 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
20690 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
206a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
206b0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
206c0 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
206d0 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
206e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
206f0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20700 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
20710 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
20720 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
20730 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
20750 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20760 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
20770 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
20780 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
20790 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
207a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
207b0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
207c0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
207d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
20800 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
20810 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c  CTOR);.      }el
20820 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
20830 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
20840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20850 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
20860 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
20870 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
20880 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
20890 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
208a0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
208b0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
208c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
208d0 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
208e0 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
208f0 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
20900 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
20910 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
20920 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
20930 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
20940 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
20950 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
20960 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
20970 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
20980 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
20990 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
209a0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
209b0 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
209c0 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
209d0 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
209e0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
209f0 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
20a00 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
20a10 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
20a20 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
20a30 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
20a40 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
20a50 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
20a60 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
20a70 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
20a80 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
20a90 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
20aa0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
20ab0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
20ac0 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
20ad0 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
20ae0 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
20af0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20b00 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70   nFarg>=2 && Exp
20b10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20b20 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  pr, EP_InfixFunc
20b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
20b40 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
20b50 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
20b60 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
20b70 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
20b80 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
20b90 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
20ba0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20bb0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
20bc0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
20bd0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
20be0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
20bf0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20c00 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20c10 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20c20 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
20c30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
20c40 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
20c50 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
20c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20c70 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20c80 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
20c90 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
20ca0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
20cb0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20cc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
20cd0 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
20ce0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20cf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20d00 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20  NC_OFFSET ){.   
20d10 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20       Expr *pArg 
20d20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
20d30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
20d40 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   pArg->op==TK_CO
20d50 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
20d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20d70 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
20d80 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20  , pArg->iTable, 
20d90 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  pArg->iColumn, t
20da0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20db0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20dd0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
20de0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20df0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
20e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20e20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61  dbeAddOp4(v, pPa
20e30 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20  rse->iSelfTab ? 
20e40 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f  OP_PureFunc0 : O
20e50 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20  P_Function0,.   
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
20e80 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63  , r1, target, (c
20e90 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
20ea0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20  NCDEF);.        
20eb0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
20ec0 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
20ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20ee0 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
20ef0 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
20f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
20f10 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
20f20 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
20f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20f40 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
20f50 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
20f60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20f70 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
20f80 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
20f90 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
20fa0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
20fb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20fc0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
20fd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20fe0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
20ff0 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53      if( op==TK_S
21000 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d  ELECT && (nCol =
21010 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
21020 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
21030 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
21040 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
21050 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43  Error(pParse, nC
21060 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ol, 1);.      }e
21070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
21080 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53  urn sqlite3CodeS
21090 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
210a0 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
210b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
210c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
210d0 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
210e0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
210f0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   n;.      if( pE
21100 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
21110 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
21120 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21130 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43  Table = sqlite3C
21140 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
21150 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
21160 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
21170 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21180 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21190 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
211a0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
211b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
211c0 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
211d0 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
211e0 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33  le!=(n = sqlite3
211f0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
21200 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20  Expr->pLeft)) . 
21210 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21220 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21230 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21240 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
21250 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21280 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
21290 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
212a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
212b0 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
212c0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
212d0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
212e0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
212f0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
21300 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21310 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
21320 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
21330 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21350 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21360 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21380 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
21390 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
213a0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
213b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
213c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
213d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
213e0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
213f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21400 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
21410 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21430 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
21440 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
21450 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21460 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
21470 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
21480 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21490 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
214a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
214b0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
214c0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
214d0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
214e0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
214f0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
21500 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
21510 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
21520 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
21530 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
21540 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21550 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21560 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
21570 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
21580 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21590 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
215a0 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
215b0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
215c0 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
215d0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
215e0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
215f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
21600 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
21620 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
21630 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
21640 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
21650 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
21660 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
21670 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64  goto expr_code_d
21680 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30  oover; /* 2018-0
21690 34 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65  4-28: Prevent de
216a0 65 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53  ep recursion. OS
216b0 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a  SFuzz. */.    }.
216c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
216d0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
216e0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
216f0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
21700 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
21710 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
21720 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
21730 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
21740 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
21750 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
21760 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
21770 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
21780 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
21790 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
217a0 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
217b0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
217c0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
217d0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
217e0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
217f0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
21800 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
21810 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
21820 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
21830 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
21840 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
21850 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
21860 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21870 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
21880 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21890 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
218a0 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
218b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
218c0 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
218d0 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
218e0 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
218f0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
21900 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
21910 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
21920 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
21930 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
21940 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
21950 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
21960 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
21970 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
21980 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
21990 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
219a0 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
219b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
219c0 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
219d0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
219e0 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
219f0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
21a00 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
21a10 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
21a20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
21a30 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
21a40 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
21a50 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
21a60 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
21a70 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
21a80 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
21a90 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
21aa0 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
21ab0 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
21ac0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21ad0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21ae0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
21af0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b00 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
21b10 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
21b20 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21b30 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
21b40 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
21b50 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
21b60 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
21b70 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
21b80 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
21b90 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
21ba0 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
21bb0 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
21bc0 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
21bd0 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
21be0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
21bf0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
21c00 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
21c10 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
21c20 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
21c30 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
21c40 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
21c50 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
21c60 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
21c70 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
21c80 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
21c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
21ca0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
21cb0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
21cc0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
21cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
21ce0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
21cf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
21d00 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
21d10 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
21d20 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
21d30 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
21d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d50 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
21d60 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
21d70 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21d80 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25  ((v, "r[%d]=%s.%
21d90 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  s", target,.    
21da0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
21db0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
21dc0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
21dd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
21de0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
21df0 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ->y.pTab->aCol[p
21e00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
21e10 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a  Name).      ));.
21e20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21e30 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
21e40 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
21e50 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
21e60 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
21e70 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
21e80 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
21e90 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
21ea0 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
21eb0 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
21ec0 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
21ed0 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
21ee0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
21ef0 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
21f00 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
21f10 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
21f20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
21f30 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
21f40 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
21f50 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
21f60 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
21f70 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
21f80 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
21f90 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
21fa0 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
21fb0 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
21fc0 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
21fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21fe0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
21ff0 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
22000 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
22010 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
22020 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
22030 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
22040 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22050 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
22060 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
22070 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22080 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22090 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
220a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
220b0 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  R;.      addrINR
220c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
220d0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
220e0 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
220f0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  ble);.      inRe
22100 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
22110 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
22120 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
22130 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22140 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
22150 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
22160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22170 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
22180 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
22190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
221a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
221b0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
221c0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
221d0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
221e0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
221f0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22200 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22210 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
22220 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
22230 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22240 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22250 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22260 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22270 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
22280 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
22290 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
222a0 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
222b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
222c0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
222d0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
222e0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
222f0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
22300 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
22310 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22320 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
22330 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
22340 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
22350 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
22360 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
22370 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
22380 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
22390 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
223a0 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
223b0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
223c0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
223d0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
223e0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
223f0 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
22400 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
22410 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
22420 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
22430 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
22440 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
22450 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
22460 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22470 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
22480 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
22490 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
224a0 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
224b0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
224c0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
224d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
224e0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
224f0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
22500 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
22510 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
22520 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
22530 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
22540 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
22550 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
22560 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
22570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22580 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
22590 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
225a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
225b0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
225c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
225d0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
225e0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
225f0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
22620 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
22630 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
22640 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22660 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
22670 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
22680 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
22690 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
226a0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
226b0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
226c0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
226d0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
226e0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
226f0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
22700 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
22710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22720 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
22730 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
22740 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22760 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
22770 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
22780 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227a0 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
227b0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
227c0 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
227d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
227e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
227f0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
22800 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
22810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
22820 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22830 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
22840 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
22850 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
22860 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
22870 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
22880 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
22890 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
228a0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
228b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
228c0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
228d0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
228e0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
228f0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
22900 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
22910 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
22920 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
22930 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72  ter(&tempX, expr
22940 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
22950 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
22960 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
22970 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
22980 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
22990 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61   memset(&opCompa
229a0 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70  re, 0, sizeof(op
229b0 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20  Compare));.     
229c0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
229d0 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
229e0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
229f0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
22a00 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
22a10 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
22a20 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
22a30 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
22a40 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
22a50 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
22a60 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
22a70 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
22a80 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
22a90 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
22aa0 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
22ab0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
22ac0 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
22ad0 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
22ae0 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
22af0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
22b00 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
22b10 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
22b20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
22b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
22b40 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
22b50 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
22b60 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
22b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
22b80 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
22b90 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
22ba0 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
22bb0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
22bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22bd0 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
22be0 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
22bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22c00 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
22c10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22c20 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
22c30 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
22c40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
22c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22c60 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
22c70 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
22c80 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
22c90 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
22ca0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
22cb0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
22cc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
22cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22ce0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
22cf0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
22d00 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
22d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22d20 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
22d30 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
22d40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22d50 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
22d60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22d70 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
22d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
22d90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
22da0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
22db0 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
22dc0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
22dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22df0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
22e00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
22e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22e20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22e30 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
22e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
22e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22e60 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
22e70 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
22e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22e90 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
22ea0 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
22eb0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
22ec0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
22ed0 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
22ee0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
22ef0 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
22f00 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
22f10 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
22f20 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
22f30 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
22f40 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
22f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
22f60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
22f90 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
22fa0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
22fb0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
22fc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22fe0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
22ff0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
23000 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
23010 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
23020 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23030 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23040 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
23050 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
23060 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
23070 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
23080 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23090 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
230a0 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
230b0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
230c0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
230d0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
230e0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
230f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
23100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23110 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
23120 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
23130 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
23140 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23170 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
23180 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
23190 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
231a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
231b0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
231c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
231d0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
231e0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
231f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23200 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
23210 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
23220 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
23230 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
23240 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
23250 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
23260 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
23270 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
23280 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
23290 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
232a0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
232b0 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
232c0 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
232d0 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
232e0 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
232f0 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
23300 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
23310 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
23320 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
23330 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
23340 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
23350 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
23360 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
23370 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
23380 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
23390 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
233a0 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
233b0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
233c0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
233d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
233e0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
233f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
23400 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
23410 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23420 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
23430 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
23440 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
23450 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
23460 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
23470 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
23480 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
23490 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
234a0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
234b0 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
234c0 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
234d0 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
234e0 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
234f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23500 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
23510 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
23520 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
23530 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
23540 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
23550 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
23560 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
23570 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
23580 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
23590 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
235a0 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
235b0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
235c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
235d0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
235e0 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
235f0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
23600 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
23610 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23620 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
23630 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
23640 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23650 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
23660 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
23670 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
23680 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
23690 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
236a0 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
236b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
236c0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
236d0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
236e0 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
236f0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
23700 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
23710 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
23720 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23730 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
23740 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
23750 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
23760 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
23770 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
23780 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
23790 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
237a0 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
237b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
237c0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
237d0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
237e0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
237f0 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
23800 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
23810 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
23820 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
23830 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
23840 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
23850 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
23860 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
23870 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
23880 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23890 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
238a0 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
238b0 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
238c0 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
238d0 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
238e0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
238f0 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
23900 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
23910 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
23920 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
23930 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23940 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
23950 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23960 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
23970 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
23980 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
23990 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
239a0 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
239b0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
239c0 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
239d0 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
239e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
239f0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
23a00 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
23a10 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
23a20 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
23a30 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
23a40 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
23a50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
23a60 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
23a70 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
23a80 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23a90 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23aa0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
23ab0 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
23ac0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
23ad0 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
23ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
23af0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23b00 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
23b10 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
23b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
23b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23b40 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
23b50 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
23b60 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
23b70 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
23b80 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
23b90 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
23ba0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
23bb0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
23bc0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
23bd0 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
23be0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
23bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23c00 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
23c10 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
23c20 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
23c30 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
23c40 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
23c50 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
23c60 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
23c70 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
23c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23c90 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
23ca0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
23cb0 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
23cc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23cd0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
23ce0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23cf0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
23d00 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
23d10 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
23d20 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
23d30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23d40 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
23d50 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
23d60 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
23d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23d80 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
23d90 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
23da0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
23db0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23dc0 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
23dd0 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
23de0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
23df0 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
23e00 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
23e10 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
23e20 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
23e30 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
23e40 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
23e50 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
23e60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
23e70 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
23e80 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
23e90 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
23ea0 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
23eb0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
23ec0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
23ed0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23ee0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
23ef0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
23f00 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
23f10 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
23f20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
23f30 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23f40 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
23f50 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
23f60 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
23f70 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
23f80 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
23f90 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
23fa0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
23fb0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
23fc0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
23fd0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
23fe0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
23ff0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24000 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24010 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
24020 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24030 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24040 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
24050 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
24060 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
24070 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
24080 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
24090 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
240a0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
240b0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
240c0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
240d0 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
240e0 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
240f0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
24100 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24110 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
24120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24130 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24140 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24150 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24160 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
24170 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
24180 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24190 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
241a0 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65  at evaluates the
241b0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
241c0 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
241d0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
241e0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
241f0 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
24200 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
24210 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
24220 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
24230 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
24240 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
24250 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
24260 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
24270 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
24280 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
24290 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
242a0 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
242b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
242c0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
242d0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
242e0 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
242f0 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
24300 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
24310 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
24320 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
24330 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
24340 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
24350 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
24360 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
24370 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24380 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24390 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
243a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
243b0 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iMem;..  assert(
243c0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
243d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
243e0 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  !=TK_REGISTER );
243f0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
24400 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
24410 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65  , target);.  iMe
24420 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
24430 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
24440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
24450 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d  py, target, iMem
24460 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  );.  exprToRegis
24470 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29  ter(pExpr, iMem)
24480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24490 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
244a0 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
244b0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
244c0 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
244d0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
244e0 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
244f0 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
24500 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
24510 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
24520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
24530 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
24540 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
24550 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73  urned will.** us
24560 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e  ually be pList->
24570 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20  nExpr but might 
24580 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51  be reduced if SQ
24590 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
245a0 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e  F.** is defined.
245b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
245c0 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20  E_ECEL_DUP flag 
245d0 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67  prevents the arg
245e0 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  uments from bein
245f0 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e  g.** filled usin
24600 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f  g OP_SCopy.  OP_
24610 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65  Copy must be use
24620 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
24630 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24640 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74  _FACTOR argument
24650 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74   allows constant
24660 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65   arguments to be
24670 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74  .** factored out
24680 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61   into initializa
24690 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  tion code..**.**
246a0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
246b0 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20  _REF flag means 
246c0 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
246d0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74   in the list wit
246e0 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b  h.** ExprList.a[
246f0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
24700 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79  l>0 have already
24710 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20   been evaluated 
24720 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  and stored.** in
24730 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72   registers at sr
24740 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65  cReg, and so the
24750 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f   value can be co
24760 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e  pied from there.
24770 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43  .** If SQLITE_EC
24780 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c  EL_OMITREF is al
24790 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  so set, then the
247a0 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78   values with u.x
247b0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a  .iOrderByCol>0.*
247c0 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69  * are simply omi
247d0 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  tted rather than
247e0 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72   being copied fr
247f0 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e  om srcReg..*/.in
24800 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
24810 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
24820 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
24830 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24840 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
24850 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
24860 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
24870 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
24880 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
24890 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
248a0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
248b0 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c  */.  int srcReg,
248c0 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
248d0 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53  e registers if S
248e0 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a  QLITE_ECEL_REF *
248f0 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20  /.  u8 flags    
24900 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
24910 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f  _ECEL_* flags */
24920 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
24930 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24940 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  m;.  int i, j, n
24950 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
24960 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24970 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
24980 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
24990 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
249a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
249b0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
249c0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
249d0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
249e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
249f0 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
24a00 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
24a10 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
24a20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
24a30 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
24a40 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
24a50 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
24a60 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
24a70 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
24a80 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
24a90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
24aa0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
24ab0 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66  m->pExpr;.#ifdef
24ac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
24ad0 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
24ae0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
24af0 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  bSorterRef ){.  
24b00 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e      i--;.      n
24b10 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  --;.    }else.#e
24b20 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c  ndif.    if( (fl
24b30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
24b40 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
24b50 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
24b60 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
24b70 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
24b80 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
24b90 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20  TREF ){.        
24ba0 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  i--;.        n--
24bb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24bd0 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
24be0 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
24bf0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
24c00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
24c10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24c20 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30  _ECEL_FACTOR)!=0
24c30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
24c40 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
24c50 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
24c60 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  r).    ){.      
24c70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24c80 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24c90 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
24ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24cb0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
24cc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
24cd0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
24ce0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
24cf0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
24d00 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
24d10 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
24d20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
24d30 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
24d40 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
24d50 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
24d60 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
24d70 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
24d80 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
24d90 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
24da0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
24db0 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
24dc0 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
24dd0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
24de0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
24df0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
24e00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24e10 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
24e20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
24e30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24e40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24e50 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
24e60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
24e70 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
24e80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
24e90 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
24ea0 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
24eb0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
24ec0 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
24ed0 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
24ee0 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
24ef0 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
24f00 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
24f10 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
24f20 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
24f30 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
24f40 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
24f50 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
24f60 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
24f80 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
24f90 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
24fa0 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
24fb0 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
24fc0 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
24fd0 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
24fe0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
24ff0 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25000 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
25010 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
25020 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
25030 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
25040 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
25050 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
25060 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
25070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
25080 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
25090 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
250a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
250b0 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
250c0 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
250d0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
250e0 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
250f0 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
25100 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
25110 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
25120 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
25130 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
25140 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
25150 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
25160 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
25170 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
25180 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
25190 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
251a0 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
251b0 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
251c0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
251d0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
251e0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
251f0 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
25200 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
25210 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
25220 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
25230 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
25240 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
25250 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
25260 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
25270 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
25280 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
25290 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
252a0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
252b0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
252c0 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
252d0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
252e0 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
252f0 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
25300 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
25310 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25320 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
25330 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
25340 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
25350 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
25360 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
25370 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
25380 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
25390 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
253a0 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
253b0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
253c0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
253d0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
253e0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
253f0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
25400 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
25410 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
25420 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
25430 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
25440 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
25450 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
25460 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
25470 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
25480 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
25490 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
254a0 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
254b0 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
254c0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
254d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
254e0 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
254f0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78    /* Mark the ex
25500 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e  pression is bein
25510 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  g from the ON or
25520 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
25530 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73   a join.    ** s
25540 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  o that the sqlit
25550 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
25560 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
25570 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  not attempt to m
25580 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  ove.    ** it in
25590 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f  to the Parse.pCo
255a0 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57  nstExpr list.  W
255b0 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e  e should use a n
255c0 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c  ew bit for this,
255d0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72  .    ** for clar
255e0 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20  ity, but we are 
255f0 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74  out of bits in t
25600 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  he Expr.flags fi
25610 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a  eld so we.    **
25620 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74   have to reuse t
25630 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62  he EP_FromJoin b
25640 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a  it.  Bummer. */.
25650 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20      exprX.flags 
25660 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
25670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25680 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25690 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
256a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
256b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
256c0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
256d0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
256e0 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
256f0 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
25700 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25710 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
25720 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
25730 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
25740 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25750 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25760 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
25770 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
25780 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
25790 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
257a0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
257b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
257c0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
257d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
257e0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
257f0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25800 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
25810 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
25820 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25830 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25840 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
25850 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
25860 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25870 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25880 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25890 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
258a0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
258b0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
258c0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
258d0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
258e0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
258f0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
25900 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25910 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
25920 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
25930 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
25940 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25950 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mp==0 );.}../*.*
25960 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25970 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
25980 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
25990 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
259a0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
259b0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
259c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
259d0 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
259e0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
259f0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
25a00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25a10 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
25a20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25a30 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
25a40 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
25a50 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
25a60 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
25a70 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
25a80 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
25a90 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
25aa0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
25ab0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
25ac0 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
25ad0 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
25ae0 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
25af0 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
25b00 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
25b10 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
25b20 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
25b30 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
25b40 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
25b50 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
25b60 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
25b70 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
25b80 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
25b90 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
25ba0 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
25bb0 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
25bc0 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
25bd0 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
25be0 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
25bf0 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
25c00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25c10 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
25c20 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25c30 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
25c40 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
25c50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
25c60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
25c70 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
25c80 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
25c90 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
25ca0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
25cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
25cc0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
25cd0 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
25ce0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25cf0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
25d00 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
25d10 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
25d20 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
25d30 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
25d40 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
25d50 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
25d60 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
25d70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
25d80 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
25d90 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
25da0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
25db0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
25dc0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
25dd0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
25de0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25df0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
25e00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
25e10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
25e20 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
25e30 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
25e40 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
25e50 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
25e60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
25e70 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
25e80 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25e90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25ea0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
25eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25ec0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
25ed0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
25ee0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
25ef0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
25f00 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
25f10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25f20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25f30 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25f40 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
25f50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
25f60 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
25f70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
25f80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
25f90 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
25fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
25fb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25fd0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25fe0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
25ff0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26010 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
26020 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
26030 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a  t isNot;      /*
26040 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
26050 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
26060 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
26070 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45  ;     /* IS TRUE
26080 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
26090 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
260a0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
260b0 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20   );.      isNot 
260c0 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
260d0 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73  _ISNOT;.      is
260e0 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
260f0 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
26100 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
26110 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54     testcase( isT
26120 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26140 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74  !isTrue && isNot
26150 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
26160 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a  True ^ isNot ){.
26170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26180 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26190 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
261a0 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
261d0 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
261e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
261f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26200 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26210 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26220 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26240 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
26250 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
26260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26270 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26280 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
26290 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
262a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
262b0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
262c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
262d0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
262e0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
262f0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
26300 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
26310 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
26320 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
26330 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
26340 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
26350 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
26360 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
26370 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
26380 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
26390 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
263a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
263b0 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
263c0 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
263d0 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
263e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
263f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26400 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
26410 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26420 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26430 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
26440 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
26450 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26460 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
26470 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
26480 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
26490 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
264a0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
264b0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
264d0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
264e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
264f0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
26500 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
26510 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
26520 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26530 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
26540 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
26550 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26560 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
26570 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26580 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
26590 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
265a0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
265b0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
265c0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
265d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
265e0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
265f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
26600 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
26610 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
26620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26630 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
26640 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
26650 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
26660 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
26670 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
26680 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
26690 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
266a0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
266b0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
266c0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
266d0 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
266e0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
266f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26700 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
26710 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26720 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26730 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
26740 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
26750 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26760 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
26770 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
26780 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
26790 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
267a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
267b0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
267c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
267d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
267e0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
267f0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
26800 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
26810 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
26820 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
26830 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
26840 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
26850 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
26860 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
26870 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
26880 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
26890 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
268a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
268b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
268c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
268d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
268e0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
268f0 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
26900 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26910 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
26920 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26930 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
26940 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
26950 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26960 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26980 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
26990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
269a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
269b0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
269c0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
269d0 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
269e0 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75  e3ExprIfTrue, ju
269f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
26a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26a20 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
26a30 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
26a40 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
26a50 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
26a60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26a70 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
26a80 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
26a90 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
26aa0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
26ab0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
26ac0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
26ad0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
26ae0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
26af0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
26b00 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
26b10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26b20 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
26b30 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
26b40 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
26b50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
26b60 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
26b70 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
26b80 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26ba0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
26bb0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
26bc0 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
26bd0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
26be0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
26bf0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
26c00 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
26c10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26c20 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
26c30 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26c50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
26c60 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
26c70 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
26c80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
26c90 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
26ca0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26cb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
26cc0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26cd0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
26ce0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26cf0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
26d00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26d10 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
26d20 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
26d30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26d40 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
26d50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26d60 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
26d70 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
26d80 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
26d90 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
26da0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
26db0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26dc0 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
26dd0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
26de0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
26df0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
26e00 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
26e10 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
26e20 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
26e30 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
26e40 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
26e50 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
26e60 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
26e70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26e80 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
26e90 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
26ea0 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
26eb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26ec0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
26ed0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
26ee0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
26ef0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
26f00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
26f10 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
26f20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26f30 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
26f40 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
26f50 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
26f60 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
26f70 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26f80 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
26f90 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
26fa0 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
26fb0 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
26fc0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26fd0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26fe0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
26ff0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
27000 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
27010 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
27020 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
27030 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
27040 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
27050 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
27060 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
27070 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
27080 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
27090 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
270a0 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
270b0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
270c0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
270d0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
270e0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
270f0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
27100 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
27110 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
27120 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
27130 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
27140 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
27150 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
27160 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
27170 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
27180 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
27190 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
271a0 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
271b0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
271c0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
271d0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
271e0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
271f0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27200 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27210 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27220 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27230 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
27240 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
27250 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
27260 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
27270 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
27280 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
27290 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
272a0 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
272b0 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
272c0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
272d0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
272e0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
272f0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27300 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27310 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27320 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27330 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
27340 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
27350 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
27360 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27370 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
27380 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
27390 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
273a0 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
273b0 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
273c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
273d0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
273e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
273f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
27400 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
27410 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27420 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
27430 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
27440 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27450 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
27460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27470 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
27480 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
27490 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
274a0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
274b0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
274c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
274d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
274e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
274f0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27500 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27510 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27530 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27540 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
27550 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27570 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
27580 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
27590 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
275a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
275b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
275c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
275d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
275e0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
275f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
27600 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
27610 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
27620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27630 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27640 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
27650 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27660 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27670 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27680 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
27690 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
276a0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
276b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
276c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
276d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
276e0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
276f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
27700 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27720 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
27730 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
27740 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
27750 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
27760 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
27770 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
27780 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
27790 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
277a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
277b0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
277c0 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
277d0 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
277e0 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
277f0 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
27800 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
27810 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
27820 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
27830 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27840 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
27850 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
27860 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
27870 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
27880 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
27890 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
278a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
278b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
278c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
278d0 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
27900 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27910 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
27920 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
27930 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
27940 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
27950 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27960 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27970 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
279a0 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
279b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
279c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
279d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
279e0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
279f0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
27a00 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
27a10 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
27a20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27a30 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
27a40 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
27a50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
27a60 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
27a70 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
27a80 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
27a90 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
27aa0 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
27ab0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
27ac0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
27ad0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
27ae0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
27af0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
27b00 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
27b10 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
27b20 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
27b30 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
27b40 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
27b50 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27b60 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27b70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
27b80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
27b90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27ba0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
27bb0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
27bc0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27bd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27be0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
27bf0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
27c00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27c10 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
27c20 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
27c30 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
27c40 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
27c50 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
27c60 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
27c70 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27c80 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
27c90 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
27ca0 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
27cb0 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
27cc0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27cd0 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
27ce0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
27cf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27d00 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
27d10 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
27d20 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
27d30 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
27d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27d50 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
27d60 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
27d70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27d80 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
27d90 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
27da0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
27db0 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
27dc0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27dd0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
27de0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
27df0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27e00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27e10 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27e20 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
27e30 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27e50 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
27e60 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
27e70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27e80 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27e90 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
27ea0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
27eb0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27ec0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27ed0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27ee0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27ef0 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
27f00 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
27f10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27f20 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
27f30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
27f40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27f50 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
27f60 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
27f70 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
27f80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27f90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27fa0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
27fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27fc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
27fd0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
27fe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27ff0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
28000 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28010 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
28020 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28030 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
28040 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
28050 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28060 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28070 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28080 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28090 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
280a0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
280b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
280c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
280d0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
280e0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
280f0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28100 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28110 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28140 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28150 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
28160 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
28170 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
28180 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
28190 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
281a0 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
281b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
281c0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
281d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
281e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
281f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28200 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28210 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
28220 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28230 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28240 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
28250 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
28260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28270 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
28280 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
28290 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
282a0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
282b0 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
282c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
282d0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
282e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
282f0 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
28300 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28310 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
28320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28330 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28340 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28350 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
28360 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
28370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28380 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
28390 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
283a0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
283b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
283c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
283d0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
283e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
283f0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28400 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
28410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
28430 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28440 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
28450 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28460 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
28470 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
28480 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
28490 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
284a0 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
284b0 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
284c0 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
284d0 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
284e0 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
284f0 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
28500 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
28510 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
28520 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
28530 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
28540 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28550 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
28560 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28570 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
28580 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
28590 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
285a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
285b0 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
285c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
285d0 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
285e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
285f0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
28600 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28610 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
28620 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
28630 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
28640 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
28650 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
28660 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
28670 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
28680 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
28690 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
286a0 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
286b0 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
286c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
286d0 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
286e0 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
286f0 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
28700 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
28710 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
28720 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
28730 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
28740 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
28750 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
28760 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
28770 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
28780 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
28790 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
287a0 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
287b0 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
287c0 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
287d0 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
287e0 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
287f0 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
28800 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
28810 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
28820 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
28830 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
28840 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
28850 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
28860 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
28870 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
28880 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
28890 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
288a0 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
288b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
288c0 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
288d0 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
288e0 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
288f0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
28900 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
28910 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
28920 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
28930 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
28940 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
28950 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
28960 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
28970 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
28980 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
28990 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
289a0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
289b0 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
289c0 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
289d0 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
289e0 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
289f0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
28a00 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
28a10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
28a20 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
28a30 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
28a40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28a50 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
28a60 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
28a70 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
28a80 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
28a90 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
28aa0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
28ab0 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
28ac0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28ad0 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
28ae0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
28af0 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
28b00 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
28b10 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
28b20 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
28b30 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
28b40 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
28b50 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
28b60 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
28b70 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
28b80 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
28b90 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
28ba0 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
28bb0 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
28bc0 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
28bd0 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
28be0 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
28bf0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
28c00 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
28c10 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
28c20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
28c30 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
28c40 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
28c50 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
28c60 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
28c70 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
28c80 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
28c90 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
28ca0 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
28cb0 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
28cc0 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
28cd0 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
28ce0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
28cf0 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
28d00 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
28d10 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
28d20 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
28d30 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
28d40 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
28d50 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
28d60 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
28d70 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
28d80 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
28d90 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
28da0 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
28db0 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
28dc0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
28dd0 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
28de0 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
28df0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
28e00 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
28e10 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
28e20 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
28e30 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
28e40 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
28e50 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
28e60 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
28e70 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
28e80 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
28e90 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
28ea0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
28eb0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
28ec0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
28ed0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
28ee0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
28ef0 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
28f00 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
28f10 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
28f20 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
28f30 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
28f40 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
28f50 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
28f60 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
28f70 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
28f80 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
28f90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
28fa0 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
28fb0 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
28fc0 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
28fd0 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
28fe0 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
28ff0 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
29000 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
29010 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
29020 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
29030 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
29040 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
29050 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
29060 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
29070 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
29080 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
29090 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
290a0 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
290b0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
290c0 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
290d0 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
290e0 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
290f0 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
29100 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
29110 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
29120 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29130 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
29140 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
29150 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
29160 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
29170 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
29180 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
29190 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
291a0 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
291b0 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
291c0 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
291d0 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
291e0 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
291f0 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
29200 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29210 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
29220 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
29230 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
29240 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29250 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
29260 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
29270 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
29280 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
29290 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
292a0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
292b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
292c0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
292d0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
292e0 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
292f0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
29300 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29310 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29320 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
29330 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
29340 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29350 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
29360 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
29370 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29380 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
29390 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
293a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
293b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
293c0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
293d0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
293e0 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
293f0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
29400 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
29410 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
29420 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
29430 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
29440 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
29450 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
29460 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
29470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29480 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
29490 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
294a0 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61  cation for the a
294b0 73 73 65 72 74 28 29 3a 0a 20 20 20 20 20 20 2a  ssert():.      *
294c0 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
294d0 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54  ns have p->op==T
294e0 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61  K_FUNCTION but a
294f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
29500 6e 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  ns.      ** have
29510 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46   p->op==TK_AGG_F
29520 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79  UNCTION.  So any
29530 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
29540 65 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65  een an aggregate
29550 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
29560 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20  on and a window 
29570 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
29580 68 61 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f  have failed befo
29590 72 65 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20  re reaching.    
295a0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e    ** this point.
295b0 20 20 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74    And, it is not
295c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
295d0 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  e a window funct
295e0 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ion and.      **
295f0 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69   a scalar functi
29600 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  on with the same
29610 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72   name and number
29620 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
29630 53 6f 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 77  So.      ** if w
29640 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
29650 6e 74 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64  nt, either A and
29660 20 42 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66   B both window f
29670 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20  unctions or.    
29680 20 20 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65    ** neither are
29690 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
296a0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ons. */.      as
296b0 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
296c0 70 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46  perty(pA,EP_WinF
296d0 75 6e 63 29 3d 3d 45 78 70 72 48 61 73 50 72 6f  unc)==ExprHasPro
296e0 70 65 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46  perty(pB,EP_WinF
296f0 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 69 66  unc) );.      if
29700 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
29710 79 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29  y(pA,EP_WinFunc)
29720 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
29730 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
29740 70 61 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e  pare(pParse,pA->
29750 79 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e 70 57 69  y.pWin,pB->y.pWi
29760 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
29770 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
29780 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
29790 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
297a0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  E ){.      if( s
297b0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
297c0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
297d0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
297e0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
297f0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
29800 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
29810 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
29820 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
29830 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
29840 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
29850 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
29860 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
29870 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
29880 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
29890 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
298a0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
298b0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
298c0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
298d0 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
298e0 20 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f 6d   2;.    if( (com
298f0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29900 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20  FixedCol)==0.   
29910 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
29920 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
29930 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
29940 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
29950 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
29960 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29970 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
29980 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
29990 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
299a0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
299b0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
299c0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
299d0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
299e0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
299f0 20 20 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d      assert( (com
29a00 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29a10 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
29a20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54     if( pA->op!=T
29a30 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 41 2d 3e  K_STRING && pA->
29a40 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45  op!=TK_TRUEFALSE
29a50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
29a60 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
29a70 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
29a80 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
29a90 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
29aa0 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
29ab0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
29ac0 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
29ad0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
29ae0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
29af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29b00 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
29b10 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
29b20 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
29b30 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
29b40 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
29b50 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
29b60 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
29b70 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
29b80 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
29b90 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
29ba0 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
29bb0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
29bc0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
29bd0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
29be0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
29bf0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
29c00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29c10 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
29c20 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
29c30 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
29c40 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
29c50 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
29c60 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
29c70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
29c80 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
29c90 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
29ca0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
29cb0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
29cc0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
29cd0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
29ce0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
29cf0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
29d00 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
29d10 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
29d20 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
29d30 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
29d40 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
29d50 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
29d60 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
29d70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
29d80 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
29d90 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
29da0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
29db0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
29dc0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
29dd0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
29de0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
29df0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
29e00 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
29e10 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
29e20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
29e30 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
29e40 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
29e50 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
29e60 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
29e70 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
29e80 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
29e90 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
29ea0 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
29eb0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
29ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29ed0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
29ee0 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
29ef0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
29f00 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29f10 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
29f20 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
29f30 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
29f40 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
29f50 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
29f60 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
29f70 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29f80 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
29f90 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
29fa0 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
29fb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29fc0 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
29fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
29fe0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a000 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2a010 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2a020 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2a030 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2a040 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
2a050 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
2a060 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
2a070 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
2a080 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
2a090 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
2a0a0 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
2a0b0 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
2a0c0 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
2a0d0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
2a0e0 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
2a0f0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
2a100 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
2a110 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2a120 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
2a130 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2a140 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
2a150 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
2a160 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
2a170 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
2a180 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2a190 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
2a1a0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2a1b0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
2a1c0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2a1d0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
2a1e0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2a1f0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2a200 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
2a210 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
2a220 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2a230 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2a240 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
2a250 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2a260 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
2a270 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
2a280 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
2a290 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
2a2a0 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
2a2b0 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
2a2c0 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
2a2d0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
2a2e0 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
2a2f0 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  b..**.** If pPar
2a300 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
2a310 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
2a320 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
2a330 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a  es in pE1 are .*
2a340 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e  * compared again
2a350 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  st literal value
2a360 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61  s in pE2 and pPa
2a370 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
2a380 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69  ask is.** modifi
2a390 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69  ed to record whi
2a3a0 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ch bound variabl
2a3b0 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  es are reference
2a3c0 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a  d.  If pParse .*
2a3d0 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  * is NULL, then 
2a3e0 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65  false will be re
2a3f0 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f  turned if pE1 co
2a400 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64  ntains any bound
2a410 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
2a420 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
2a430 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
2a440 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
2a450 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
2a460 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
2a470 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
2a480 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
2a490 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
2a4a0 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
2a4b0 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
2a4c0 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
2a4d0 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
2a4e0 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
2a4f0 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
2a500 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2a510 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
2a520 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
2a530 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
2a540 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
2a550 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2a560 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69  rse, pE1, pE2, i
2a570 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
2a580 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2a590 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
2a5a0 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
2a5b0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2a5c0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2a5d0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2a5f0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2a600 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
2a610 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
2a620 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
2a630 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2a640 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2a650 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d  _NOTNULL && pE1-
2a660 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
2a670 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
2a680 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58   ){.    Expr *pX
2a690 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2a6a0 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70  ipCollate(pE1->p
2a6b0 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Left);.    testc
2a6c0 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c  ase( pX!=pE1->pL
2a6d0 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73  eft );.    if( s
2a6e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a6f0 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45  e(pParse, pX, pE
2a700 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
2a710 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2a720 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2a730 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2a740 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61  the Expr node ca
2a750 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74  llback for sqlit
2a760 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  e3ExprImpliesNot
2a770 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66  NullRow()..** If
2a780 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2a790 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68  node requires th
2a7a0 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74 20  at the table at 
2a7b0 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a  pWalker->iCur.**
2a7c0 20 68 61 76 65 20 6f 6e 65 20 6f 72 20 6d 6f 72   have one or mor
2a7d0 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d  e non-NULL colum
2a7e0 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c  n, then set pWal
2a7f0 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20  ker->eCode to 1 
2a800 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
2a810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   This routine co
2a820 6e 74 72 6f 6c 73 20 61 6e 20 6f 70 74 69 6d 69  ntrols an optimi
2a830 7a 61 74 69 6f 6e 2e 20 20 46 61 6c 73 65 20 70  zation.  False p
2a840 6f 73 69 74 69 76 65 73 20 28 73 65 74 74 69 6e  ositives (settin
2a850 67 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43  g.** pWalker->eC
2a860 6f 64 65 20 74 6f 20 31 20 77 68 65 6e 20 69 74  ode to 1 when it
2a870 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 29 20   should not be) 
2a880 61 72 65 20 64 65 61 64 6c 79 2c 20 62 75 74 20  are deadly, but 
2a890 66 61 6c 73 65 2d 6e 65 67 61 74 69 76 65 73 0a  false-negatives.
2a8a0 2a 2a 20 28 6e 65 76 65 72 20 73 65 74 74 69 6e  ** (never settin
2a8b0 67 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  g pWalker->eCode
2a8c0 29 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  ) is a harmless 
2a8d0 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74  missed optimizat
2a8e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2a8f0 6e 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  nt impliesNotNul
2a900 6c 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57 61  lRow(Walker *pWa
2a910 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2a920 72 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r){.  testcase( 
2a930 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2a940 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65  G_COLUMN );.  te
2a950 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2a960 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2a970 4f 4e 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ON );.  if( Expr
2a980 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a990 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
2a9a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
2a9b0 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  ne;.  switch( pE
2a9c0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2a9d0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
2a9e0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
2a9f0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
2aa00 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  L:.    case TK_I
2aa10 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  S:.    case TK_O
2aa20 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  R:.    case TK_C
2aa30 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASE:.    case TK
2aa40 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
2aa50 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2aa60 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2aa70 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
2aa80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2aa90 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2aaa0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
2aab0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2aac0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
2aad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2aae0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2aaf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ab00 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ab10 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2ab20 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ab30 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2ab40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2ab50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2ab60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ab70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2ab80 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2ab90 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2aba0 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  e;.    case TK_C
2abb0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28  OLUMN:.      if(
2abc0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72   pWalker->u.iCur
2abd0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2abe0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  ){.        pWalk
2abf0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
2ac00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2ac10 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2ac20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2ac30 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a  C_Prune;..    /*
2ac40 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   Virtual tables 
2ac50 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75  are allowed to u
2ac60 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c  se constraints l
2ac70 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a  ike x=NULL.  So.
2ac80 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66      ** a term of
2ac90 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f   the form x=y do
2aca0 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  es not prove tha
2acb0 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  t y is not null 
2acc0 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74  if x.    ** is t
2acd0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76  he column of a v
2ace0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
2acf0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2ad00 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2ad10 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2ad20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2ad30 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2ad40 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2ad50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ad60 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
2ad70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ad80 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ad90 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
2ada0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2adb0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
2adc0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2add0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
2ade0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2adf0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
2ae00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ae10 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ae20 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66  K_GE );.      if
2ae30 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ( (pExpr->pLeft-
2ae40 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2ae50 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2ae60 72 2d 3e 70 4c 65 66 74 2d 3e 79 2e 70 54 61 62  r->pLeft->y.pTab
2ae70 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45  )).       || (pE
2ae80 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d  xpr->pRight->op=
2ae90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2aea0 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70  Virtual(pExpr->p
2aeb0 52 69 67 68 74 2d 3e 79 2e 70 54 61 62 29 29 0a  Right->y.pTab)).
2aec0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2aed0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2aee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65  ;.      }.    de
2aef0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
2af00 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2af10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2af20 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
2af30 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65 73 73  zero) if express
2af40 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62  ion p can only b
2af50 65 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  e true if at lea
2af60 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e  st.** one column
2af70 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62 20 69   of table iTab i
2af80 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20  s non-null.  In 
2af90 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
2afa0 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65  urn true.** if e
2afb0 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2afc0 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20   always be NULL 
2afd0 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76 65 72  or false if ever
2afe0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2aff0 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
2b000 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76  ** False negativ
2b010 65 73 20 61 72 65 20 61 63 63 65 70 74 61 62 6c  es are acceptabl
2b020 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
2b030 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20  ds, it is ok to 
2b040 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65  return.** zero e
2b050 76 65 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f  ven if expressio
2b060 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  n p will never b
2b070 65 20 74 72 75 65 20 6f 66 20 65 76 65 72 79 20  e true of every 
2b080 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a  column of iTab.*
2b090 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61  * is NULL.  A fa
2b0a0 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69 73 20  lse negative is 
2b0b0 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20  merely a missed 
2b0c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70  optimization opp
2b0d0 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  ortunity..**.** 
2b0e0 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20  False positives 
2b0f0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c  are not allowed,
2b100 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c   however.  A fal
2b110 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20  se positive may 
2b120 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
2b130 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
2b140 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
2b150 20 70 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b   p that are mark
2b160 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a  ed with EP_FromJ
2b170 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74  oin (and hence t
2b180 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a  hat come from.**
2b190 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2b1a0 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54   clauses of LEFT
2b1b0 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c   JOINS) are excl
2b1c0 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e  uded from the an
2b1d0 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  alysis..**.** Th
2b1e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2b1f0 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  ed to check if a
2b200 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2b210 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2b220 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
2b230 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67  JOIN.  The p arg
2b240 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57 48 45  ument is the WHE
2b250 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  RE clause.  If t
2b260 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2b270 73 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  se requires that
2b280 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20   some column of 
2b290 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2b2a0 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  of the LEFT JOIN
2b2b0 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c  .** be non-NULL,
2b2c0 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a   then the LEFT J
2b2d0 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c  OIN can be safel
2b2e0 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  y converted into
2b2f0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
2b300 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  join..*/.int sql
2b310 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2b320 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a  onNullRow(Expr *
2b330 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  p, int iTab){.  
2b340 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2b350 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d  xprCallback = im
2b360 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b  pliesNotNullRow;
2b370 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2b380 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53  back = 0;.  w.xS
2b390 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2b3a0 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   0;.  w.eCode = 
2b3b0 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20  0;.  w.u.iCur = 
2b3c0 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 57  iTab;.  sqlite3W
2b3d0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
2b3e0 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
2b3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
2b400 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2b410 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2b420 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2b430 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2b440 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2b450 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  an expression ca
2b460 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62  n be evaluated b
2b470 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  y reference to t
2b480 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79  he.** index only
2b490 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  , without having
2b4a0 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20   to do a search 
2b4b0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2b4c0 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65  nding.** table e
2b4d0 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f  ntry.  The IdxCo
2b4e0 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69  ver.pIdx field i
2b4f0 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64  s the index.  Id
2b500 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69  xCover.iCur.** i
2b510 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
2b520 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
2b530 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b  truct IdxCover {
2b540 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
2b550 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2b560 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f   to be tested fo
2b570 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  r coverage */.  
2b580 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
2b590 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2b5a0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2b5b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2b5c0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b   the index */.};
2b5d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2b5e0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2b5f0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
2b600 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
2b610 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   .** pWalker->u.
2b620 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20  pIdxCover->iCur 
2b630 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
2b640 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
2b650 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
2b660 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a  IdxCover->pIdx..
2b670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2b680 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65  prIdxCover(Walke
2b690 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2b6a0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
2b6b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2b6c0 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72  LUMN.   && pExpr
2b6d0 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65  ->iTable==pWalke
2b6e0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2b6f0 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74  iCur.   && sqlit
2b700 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
2b710 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2b720 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70  over->pIdx, pExp
2b730 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
2b740 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
2b750 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72  eCode = 1;.    r
2b760 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2b780 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2b790 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2b7a0 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20  f an index pIdx 
2b7b0 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  on table with cu
2b7c0 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69  rsor iCur contai
2b7d0 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65  ns will.** the e
2b7e0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
2b7f0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2b800 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20   the index does 
2b810 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70  cover the.** exp
2b820 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73  ression and fals
2b830 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65  e if the pExpr e
2b840 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65  xpression refere
2b850 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d  nces table colum
2b860 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  ns.** that are n
2b870 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ot found in the 
2b880 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
2b890 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72  * An index cover
2b8a0 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
2b8b0 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  n means that the
2b8c0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
2b8d0 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  be.** evaluated 
2b8e0 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69  using only the i
2b8f0 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74  ndex and without
2b900 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75   having to looku
2b910 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  p the.** corresp
2b920 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74  onding table ent
2b930 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
2b940 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49  e3ExprCoveredByI
2b950 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45  ndex(.  Expr *pE
2b960 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  xpr,        /* T
2b970 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2b980 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
2b990 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Cur,           /
2b9a0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * The cursor num
2b9b0 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ber for the corr
2b9c0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2b9d0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2b9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b9f0 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74  index that might
2ba00 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76   be used for cov
2ba10 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61  erage */.){.  Wa
2ba20 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2ba30 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a   IdxCover xcov;.
2ba40 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
2ba50 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63  sizeof(w));.  xc
2ba60 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  ov.iCur = iCur;.
2ba70 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49    xcov.pIdx = pI
2ba80 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  dx;.  w.xExprCal
2ba90 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43  lback = exprIdxC
2baa0 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78  over;.  w.u.pIdx
2bab0 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20  Cover = &xcov;. 
2bac0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2bad0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72  (&w, pExpr);.  r
2bae0 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a  eturn !w.eCode;.
2baf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  }.../*.** An ins
2bb00 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2bb10 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2bb20 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2bb30 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
2bb40 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
2bb50 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
2bb60 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
2bb70 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
2bb80 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2bb90 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
2bba0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
2bbb0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
2bbc0 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
2bbd0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
2bbe0 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
2bbf0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
2bc00 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
2bc10 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
2bc20 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
2bc30 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
2bc40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2bc50 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2bc60 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
2bc70 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
2bc80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2bc90 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2bca0 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
2bcb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
2bcc0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
2bcd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2bce0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2bcf0 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
2bd00 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
2bd10 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2bd20 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2bd30 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
2bd40 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
2bd50 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
2bd60 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2bd70 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
2bd80 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
2bd90 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
2bda0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2bdb0 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
2bdc0 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
2bdd0 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
2bde0 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
2bdf0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2be00 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
2be10 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2be20 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
2be30 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
2be40 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
2be50 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
2be60 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
2be70 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
2be80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2be90 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
2bea0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2beb0 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
2bec0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
2bed0 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
2bee0 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
2bef0 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
2bf00 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
2bf10 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
2bf20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
2bf30 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
2bf40 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
2bf50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2bf60 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
2bf70 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
2bf80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2bf90 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
2bfa0 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
2bfb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bfc0 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
2bfd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bfe0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2bff0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
2c000 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
2c010 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
2c020 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
2c030 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
2c040 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
2c050 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
2c060 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
2c070 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
2c080 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
2c090 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
2c0a0 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
2c0b0 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
2c0c0 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
2c0d0 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
2c0e0 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
2c0f0 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
2c100 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
2c110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2c120 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2c130 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
2c140 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2c150 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
2c160 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2c170 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
2c180 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2c190 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2c1a0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c1b0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
2c1c0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2c1d0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
2c1e0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
2c1f0 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
2c200 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
2c210 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
2c220 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
2c230 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
2c240 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
2c250 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
2c260 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
2c270 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
2c280 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2c290 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2c2a0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2c2b0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2c2c0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2c2d0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2c2e0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2c2f0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2c300 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2c310 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2c320 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
2c330 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2c340 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2c350 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
2c360 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2c370 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2c380 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
2c390 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
2c3a0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
2c3b0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2c3c0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
2c3d0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2c3e0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2c3f0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
2c400 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
2c410 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2c420 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2c430 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2c440 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2c450 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2c460 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2c470 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2c480 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2c490 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
2c4a0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2c4b0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2c4c0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
2c4d0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
2c4e0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
2c4f0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
2c500 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
2c510 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
2c520 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
2c530 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
2c540 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2c550 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2c560 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
2c570 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
2c580 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
2c590 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
2c5a0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
2c5b0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2c5c0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
2c5d0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
2c5e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2c5f0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
2c600 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2c610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
2c620 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
2c630 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2c640 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2c650 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
2c660 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
2c670 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
2c680 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
2c690 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
2c6a0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
2c6b0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
2c6c0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
2c6d0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70  nfo = pNC->uNC.p
2c6e0 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  AggInfo;..  asse
2c6f0 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  rt( pNC->ncFlags
2c700 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29   & NC_UAggInfo )
2c710 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
2c720 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
2c730 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
2c740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2c750 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
2c760 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c770 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
2c780 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c790 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c7a0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2c7b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2c7c0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
2c7d0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
2c7e0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2c7f0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
2c800 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2c810 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
2c820 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
2c830 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
2c840 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2c850 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c860 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
2c870 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2c880 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
2c890 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2c8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2c8b0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2c8c0 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
2c8d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2c8e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2c8f0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2c900 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2c910 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2c920 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2c930 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2c940 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2c950 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2c960 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2c970 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
2c980 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
2c990 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
2c9a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c9b0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
2c9c0 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
2c9d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c9e0 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
2c9f0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2ca00 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
2ca10 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
2ca20 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
2ca30 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
2ca40 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
2ca50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ca70 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
2ca80 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
2ca90 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
2caa0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
2cab0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2cac0 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2cae0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
2caf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
2cb20 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2cb30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cb40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cb70 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
2cb80 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2cba0 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
2cbb0 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
2cbc0 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2cbf0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
2cc00 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
2cc10 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2cc20 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
2cc30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cc40 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
2cc50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2cc70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
2cc80 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
2cc90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2cca0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2ccb0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2ccc0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2ccd0 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2ccf0 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
2cd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cd10 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
2cd20 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2cd30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
2cd40 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2cd50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
2cd60 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
2cd70 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2cd80 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2cd90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
2cda0 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
2cdc0 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2cde0 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
2cdf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2ce10 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
2ce20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2ce30 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2ce40 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2ce50 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
2ce60 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
2ce90 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2cea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ceb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2cec0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2cf10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cf30 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2cf40 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2cf60 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2cf70 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
2cf80 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cfa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cfb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
2cfc0 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
2cfd0 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
2cfe0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
2cff0 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
2d000 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
2d010 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
2d020 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
2d030 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
2d040 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2d050 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
2d060 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
2d070 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
2d080 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
2d090 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
2d0a0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
2d0b0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2d0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
2d0d0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2d0e0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2d0f0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
2d100 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2d110 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2d120 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d130 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
2d140 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
2d150 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2d160 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
2d170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d180 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
2d190 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2d1a0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
2d1b0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
2d1c0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
2d1d0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
2d1e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2d1f0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
2d200 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
2d210 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
2d220 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
2d230 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
2d240 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
2d250 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2d260 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
2d270 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2d280 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2d290 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
2d2a0 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
2d2b0 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
2d2c0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2d2d0 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
2d2e0 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
2d2f0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
2d300 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
2d310 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2d320 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
2d330 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
2d340 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2d350 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2d360 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2d370 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2d380 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2d390 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  0, pItem->pExpr,
2d3a0 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29   pExpr, -1)==0 )
2d3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
2d3c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2d3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d3e0 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
2d3f0 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
2d400 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
2d410 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
2d420 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
2d430 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
2d440 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
2d450 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
2d460 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
2d470 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
2d480 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
2d490 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
2d4a0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2d4b0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
2d4c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2d4d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2d4e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
2d4f0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2d500 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
2d510 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
2d520 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
2d530 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
2d540 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2d550 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
2d560 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2d570 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2d580 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2d590 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2d5a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2d5b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2d5c0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
2d5d0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
2d5e0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
2d5f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2d600 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20  ->u.zToken, .   
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d620 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
2d630 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2d640 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
2d650 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d660 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
2d670 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
2d680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d690 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2d6a0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2d6b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2d6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d6d0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2d6e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2d6f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d710 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2d720 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
2d730 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
2d740 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2d750 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
2d760 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2d770 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d780 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2d790 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2d7a0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
2d7b0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d7c0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2d7d0 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45  uce);.        pE
2d7e0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2d7f0 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
2d800 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2d810 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2d820 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2d830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2d840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2d850 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
2d860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2d870 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d880 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
2d890 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
2d8a0 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
2d8b0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2d8c0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2d8d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d8e0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2d8f0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2d900 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57  th++;.  return W
2d910 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2d920 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
2d930 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2d940 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a  lectEnd(Walker *
2d950 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2d960 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2d970 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2d980 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2d990 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d  r->walkerDepth--
2d9a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
2d9b0 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
2d9c0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
2d9d0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
2d9e0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
2d9f0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
2da00 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
2da10 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
2da20 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
2da30 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
2da40 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
2da50 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
2da60 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
2da70 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
2da80 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
2da90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2daa0 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2dab0 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
2dac0 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
2dad0 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
2dae0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
2daf0 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
2db00 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2db10 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2db20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2db30 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2db40 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2db50 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2db60 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2db70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2db80 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2db90 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2dba0 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2dbb0 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a  llback2 = analyz
2dbc0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2dbd0 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b  ectEnd;.  w.walk
2dbe0 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77  erDepth = 0;.  w
2dbf0 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
2dc00 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
2dc10 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
2dc20 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2dc30 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
2dc40 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
2dc50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2dc60 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
2dc70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2dc80 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
2dc90 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
2dca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2dcb0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
2dcc0 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
2dcd0 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
2dce0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
2dcf0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2dd00 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
2dd10 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2dd20 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
2dd30 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
2dd40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2dd50 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2dd60 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
2dd70 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
2dd80 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2dd90 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
2dda0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2ddb0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2ddc0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
2ddd0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
2dde0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2ddf0 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
2de00 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
2de10 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
2de20 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
2de30 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
2de40 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2de50 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2de60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
2de70 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
2de80 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
2de90 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
2dea0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
2deb0 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
2dec0 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
2ded0 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2dee0 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
2def0 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
2df00 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
2df10 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
2df20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2df30 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
2df40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2df50 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
2df60 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
2df70 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
2df80 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
2df90 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  eg) ){.    pPars
2dfa0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
2dfb0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
2dfc0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2dfd0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
2dfe0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
2dff0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
2e000 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
2e010 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2e020 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2e030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2e040 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2e050 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d   n;.  if( nReg==
2e060 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
2e070 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2e080 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72  rse);.  i = pPar
2e090 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2e0a0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2e0b0 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2e0c0 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61  eg<=n ){.    pPa
2e0d0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
2e0e0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2e0f0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
2e100 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
2e110 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
2e120 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
2e130 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
2e140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
2e150 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
2e160 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2e170 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e180 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
2e190 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d  eg){.  if( nReg=
2e1a0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
2e1b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2e1c0 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20  pParse, iReg);. 
2e1d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2e1e0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
2e1f0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
2e200 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2e210 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
2e220 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2e230 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
2e240 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
2e250 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2e260 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
2e270 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2e280 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
2e290 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2e2a0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
2e2b0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
2e2c0 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
2e2d0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2e2e0 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2e2f0 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f  Validate that no
2e300 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2e310 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e  ter falls within
2e320 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
2e330 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20   iFirst..iLast, 
2e340 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73  inclusive.  This
2e350 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2e360 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69   call from withi
2e370 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  n assert().** st
2e380 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66  atements..*/.#if
2e390 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2e3a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65  .int sqlite3NoTe
2e3b0 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65  mpsInRange(Parse
2e3c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
2e3d0 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29  irst, int iLast)
2e3e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2e3f0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2e400 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73  eg>0.   && pPars
2e410 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61  e->iRangeReg+pPa
2e420 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e  rse->nRangeReg >
2e430 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50   iFirst.   && pP
2e440 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2e450 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20  <= iLast.  ){.  
2e460 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2e470 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2e480 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2e490 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2e4a0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2e4b0 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2e4c0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2e4d0 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2e4e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2e4f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2e500 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2e510 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.