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

Artifact d48bca738efa75f4a8731c55db8425d275e6367163ca0149bed9b6117eab5e32:


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 65 58 3d 3d 45 58 5f 53 65 6c  Expr->eX==EX_Sel
0690: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
06a0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
06b0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
06c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
06d0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
06e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
06f0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45  GISTER ) op = pE
0700: 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66 6e 64 65  xpr->op2;.#ifnde
0710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0720: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0730: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0740: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0750: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0760: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0770: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
0780: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
0790: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
07a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
07b0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
07c0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
07d0: 4c 55 4d 4e 29 20 26 26 20 70 45 78 70 72 2d 3e  LUMN) && pExpr->
07e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 74 75  pTab ){.    retu
07f0: 72 6e 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43  rn sqlite3TableC
0800: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45  olumnAffinity(pE
0810: 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72  xpr->pTab, pExpr
0820: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a  ->iColumn);.  }.
0830: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
0840: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
0850: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0860: 3e 70 4c 65 66 74 2d 3e 65 58 3d 3d 45 58 5f 53  >pLeft->eX==EX_S
0870: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
0880: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0890: 66 66 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20  ffinity(.       
08a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78   pExpr->pLeft->x
08b0: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
08c0: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
08d0: 6d 6e 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b  mn].pExpr.    );
08e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
08f0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d  xpr->affinity;.}
0900: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
0910: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0920: 63 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ce for expressio
0930: 6e 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68  n pExpr to be th
0940: 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
0950: 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79  equence named by
0960: 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72   pToken.   Retur
0970: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
0980: 20 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74   new Expr node t
0990: 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
09a0: 73 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  s the COLLATE op
09b0: 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  erator..**.** If
09c0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
09d0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
09e0: 73 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20  s, that fact is 
09f0: 72 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72  recorded in pPar
0a00: 73 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68  se->db.** and th
0a10: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
0a20: 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e  r is returned un
0a30: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72  changed..*/.Expr
0a40: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0a50: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20  CollateToken(.  
0a60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
0a80: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0a90: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
0aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
0ab0: 20 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63   the "COLLATE" c
0ac0: 6c 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78  lause to this ex
0ad0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f  pression */.  co
0ae0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  nst Token *pColl
0af0: 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name,  /* Name o
0b00: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
0b10: 65 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ence */.  int de
0b20: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
0b30: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
0b40: 71 75 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20  quote pCollName 
0b50: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c  */.){.  if( pCol
0b60: 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20  lName->n>0 ){.  
0b70: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
0b80: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
0b90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43  pParse->db, TK_C
0ba0: 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d  OLLATE, pCollNam
0bb0: 65 2c 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20  e, dequote);.   
0bc0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0bd0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
0be0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e   pExpr;.      pN
0bf0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
0c00: 43 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b  Collate|EP_Skip;
0c10: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0c20: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
0c30: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
0c40: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0c50: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0c60: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0c70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0c90: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0ca0: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0cb0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
0cc0: 28 26 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b  (&s, (char*)zC);
0cd0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0ce0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
0cf0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  oken(pParse, pEx
0d00: 70 72 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f  pr, &s, 0);.}../
0d10: 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61  *.** Skip over a
0d20: 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70  ny TK_COLLATE op
0d30: 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20  erators and any 
0d40: 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72  unlikely().** or
0d50: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75   likelihood() fu
0d60: 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f  nction at the ro
0d70: 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ot of an express
0d80: 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ion..*/.Expr *sq
0d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0da0: 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78 70 72  late(Expr *pExpr
0db0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70  ){.  while( pExp
0dc0: 72 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  r && ExprHasProp
0dd0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
0de0: 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  kip) ){.    if( 
0df0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e00: 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65  pExpr, EP_Unlike
0e10: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ly) ){.      ass
0e20: 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
0e30: 45 58 5f 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  EX_List );.     
0e40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0e50: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  x.pList->nExpr>0
0e60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0e70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0e80: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
0e90: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
0ea0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
0eb0: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
0ec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0ed0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
0ee0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 45  LATE );.      pE
0ef0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
0f00: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
0f10: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0f30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
0f40: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0f50: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0f60: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0f70: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
0f80: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
0f90: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
0fa0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c  ** See also: sql
0fb0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
0fc0: 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  q().**.** The sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20 73  eq() works the s
0ff0: 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20 69  ame exact that i
1000: 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  t returns the.**
1010: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
1020: 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73 20  on if pExpr has 
1030: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
1040: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1050: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1060: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
1070: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
1080: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
1090: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
10a0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
10b0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
10c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10d0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
10e0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
10f0: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
1100: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
1110: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
1120: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
1130: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
1140: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
1150: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
1160: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
1170: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1180: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
1190: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
11a0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
11b0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
11c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
11d0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
11e0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
11f0: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1200: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41     if( (op==TK_A
1210: 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d  GG_COLUMN || op=
1220: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
1230: 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52       || op==TK_R
1240: 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54  EGISTER || op==T
1250: 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20  K_TRIGGER).     
1260: 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20  && p->pTab!=0.  
1270: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70    ){.      /* op
1280: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
1290: 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70   p->pTab!=0 happ
12a0: 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77  ens when pExpr w
12b0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
12c0: 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55      ** a TK_COLU
12d0: 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69  MN but was previ
12e0: 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20  ously evaluated 
12f0: 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20  and cached in a 
1300: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
1310: 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f    int j = p->iCo
1320: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lumn;.      if( 
1330: 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j>=0 ){.        
1340: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1350: 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f  l = p->pTab->aCo
1360: 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
1370: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1380: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1390: 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
13a0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
13b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c0: 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  }.    if( op==TK
13d0: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
13e0: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
13f0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
1400: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1410: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1420: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
1430: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
1440: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
1450: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1460: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1470: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1480: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1490: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
14a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14b0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
14c0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
14d0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
14e0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
14f0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1500: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1510: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1520: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1530: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1540: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1550: 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67        /* p->flag
1560: 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61  s holds EP_Colla
1570: 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d  te and p->pLeft-
1580: 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e  >flags does not.
1590: 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a    And.        **
15a0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61   p->x.pSelect ca
15b0: 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e  nnot.  So if p->
15c0: 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20  x.pLeft exists, 
15d0: 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a  it must hold at.
15e0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74          ** least
15f0: 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e   one EP_Collate.
1600: 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77   Thus the follow
1610: 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20  ing two ALWAYS. 
1620: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1630: 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 7b  ->eX==EX_List ){
1640: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1650: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1660: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1670: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1680: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1690: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
16a0: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
16b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
16c0: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
16e0: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
16f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1700: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1730: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
1740: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1750: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1760: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1770: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1780: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1790: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
17a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
17b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
17c0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
17d0: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
17e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
17f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1800: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
1810: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
1820: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1830: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1840: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1850: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1860: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1870: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1880: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1890: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
18a0: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
18b0: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
18c0: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
18d0: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
18e0: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
18f0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
1900: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
1910: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
1920: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
1930: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1940: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1960: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1970: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1980: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1990: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
19a0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
19b0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
19c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
19d0: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
19e0: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
19f0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1a00: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1a10: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1a20: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1a30: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1a40: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1a50: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1a60: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1a70: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1a80: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1a90: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1aa0: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1ab0: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1ac0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1ad0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1ae0: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1af0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1b00: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1b10: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1b20: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1b30: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1b40: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1b50: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1b60: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1b70: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1b80: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1b90: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1ba0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1bb0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1bc0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1bd0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1be0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1bf0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1c00: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1c10: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1c20: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1c30: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1c40: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1c50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1c60: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1c70: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1c80: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1c90: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1ca0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1cb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cc0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1cd0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1ce0: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1cf0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1d00: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1d10: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1d20: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1d30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d40: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1d60: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1d70: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1d80: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1d90: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1da0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1db0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1dc0: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1dd0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1de0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1e00: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1e10: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1e20: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1e30: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1e40: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e50: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1e60: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1e70: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1e80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1e90: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1ea0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1eb0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1ec0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1ed0: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1ee0: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1ef0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1f00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1f20: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1f30: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1f40: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1f50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f60: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
1f70: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
1f80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
1f90: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
1fa0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
1fb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1fc0: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
1fd0: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1fe0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1ff0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
2000: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
2010: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
2020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2030: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
2040: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2050: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2060: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2070: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2080: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2090: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
20a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
20b0: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
20c0: 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65  pExpr->eX==EX_Se
20d0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
20e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
20f0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
2100: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
2110: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
2120: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
2130: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2140: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2150: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2160: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2170: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2180: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2190: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
21a0: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
21b0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
21c0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
21d0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
21e0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
21f0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
2200: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
2210: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
2220: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2230: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2240: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2250: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2260: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2270: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2280: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2290: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
22a0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
22b0: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
22c0: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
22d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
22e0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
22f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2300: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
2310: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
2320: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
2330: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2340: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2350: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2360: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2370: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2380: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2390: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
23a0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
23b0: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
23c0: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
23d0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
23e0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
23f0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
2400: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
2410: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
2420: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
2430: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2440: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2450: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2460: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2470: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2480: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2490: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
24a0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
24b0: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
24c0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
24d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
24f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2500: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
2510: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
2520: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
2530: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2540: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2550: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2560: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2570: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2580: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2590: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
25a0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
25b0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
25c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
25d0: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
25e0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
25f0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
2600: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
2610: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
2620: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
2630: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2640: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2650: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2660: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2670: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2680: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2690: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
26a0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
26b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
26c0: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
26d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
26e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
26f0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
2700: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
2710: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
2720: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
2730: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2740: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2760: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2770: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2780: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2790: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
27a0: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
27b0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
27c0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
27d0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
27e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
27f0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2800: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2810: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
2820: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
2830: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2840: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2850: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2860: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2870: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2880: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2890: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
28a0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
28b0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
28c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
28d0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
28e0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
28f0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
2900: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
2910: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
2920: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
2930: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2940: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2950: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2960: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2970: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2980: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2990: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
29a0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
29b0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
29c0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
29d0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
29e0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
29f0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2a00: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2a10: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2a20: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2a30: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2a40: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2a50: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2a60: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2a70: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2a80: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2a90: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2aa0: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2ab0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2ac0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ae0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2af0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2b00: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2b30: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2b40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b50: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2b60: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2b70: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2b80: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2b90: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2ba0: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2bb0: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2bc0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2bd0: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2be0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2bf0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2c00: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2c10: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2c20: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2c30: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2c40: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2c50: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2c60: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2c70: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2c80: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2c90: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2ca0: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2cb0: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2cc0: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2cd0: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2ce0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2cf0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2d00: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2d10: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2d20: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2d30: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2d40: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d50: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2d60: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2d70: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2d80: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2d90: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2da0: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2db0: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2dc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2dd0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2de0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2df0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2e00: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2e10: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2e20: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2e30: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2e40: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2e50: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2e60: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2e70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e80: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2e90: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2ea0: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2eb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2ec0: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2ed0: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2ee0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2f00: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2f10: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2f20: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
2f40: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
2f50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
2f60: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2f70: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
2f80: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2f90: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
2fa0: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
2fb0: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
2fc0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
2fd0: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
2fe0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
2ff0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
3000: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
3010: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
3020: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
3030: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3040: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3050: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3060: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3070: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3080: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3090: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
30a0: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
30b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
30c0: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
30d0: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
30e0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
30f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
3100: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
3110: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
3120: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
3130: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3140: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3150: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3160: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3170: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3180: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3190: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
31a0: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
31b0: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
31c0: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
31d0: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
31e0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
31f0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
3200: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
3210: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
3220: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
3230: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3240: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3250: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3270: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3280: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3290: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
32a0: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
32b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
32c0: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
32d0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
32e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
32f0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
3300: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3320: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
3330: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3340: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3350: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3370: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3380: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3390: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
33a0: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
33b0: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
33c0: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
33d0: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
33e0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
33f0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
3400: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
3410: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
3420: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
3430: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3440: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3450: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3460: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3470: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3480: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3490: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
34a0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
34b0: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
34c0: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
34d0: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
34e0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
34f0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
3500: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
3510: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
3520: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3530: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3540: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3550: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3560: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3570: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3580: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3590: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
35a0: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
35b0: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
35c0: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
35d0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
35e0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
35f0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
3600: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
3610: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
3620: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
3630: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3640: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3650: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3660: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3670: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3680: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3690: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
36a0: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
36b0: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
36c0: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
36d0: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
36e0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
36f0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
3700: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3710: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
3720: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
3730: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3740: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3750: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3760: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3770: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3780: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3790: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
37a0: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
37b0: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
37c0: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
37d0: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
37e0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
37f0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
3800: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
3810: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
3820: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
3830: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3840: 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 29 3b  eX==EX_Select );
3850: 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53  .    /* The TK_S
3860: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70  ELECT_COLUMN Exp
3870: 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20  r node:.    **. 
3880: 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20     ** pLeft:    
3890: 20 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63         pVector c
38a0: 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c  ontaining TK_SEL
38b0: 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65  ECT.  Not delete
38c0: 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74  d..    ** pRight
38d0: 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75  :          not u
38e0: 73 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73  sed.  But recurs
38f0: 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20  ively deleted.. 
3900: 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20     ** iColumn:  
3910: 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20         Index of 
3920: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63  a column in pVec
3930: 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c  tor.    ** iTabl
3940: 65 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72  e:          0 or
3950: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3960: 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48  olumns on the LH
3970: 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65  S of an assignme
3980: 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d  nt.    ** pLeft-
3990: 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74  >iTable:   First
39a0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
39b0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
39c0: 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20   result, or 0.  
39d0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
39e0: 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73        if the res
39f0: 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63  ult is not yet c
3a00: 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  omputed..    **.
3a10: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
3a20: 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69  prDelete() speci
3a30: 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68  fically skips th
3a40: 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65  e recursive dele
3a50: 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65  te of.    ** pLe
3a60: 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f  ft on TK_SELECT_
3a70: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42  COLUMN nodes.  B
3a80: 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c  ut pRight is fol
3a90: 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f  lowed, so pVecto
3aa0: 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  r.    ** can be 
3ab0: 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67  attached to pRig
3ac0: 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73  ht to cause this
3ad0: 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77   node to take ow
3ae0: 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a  nership of.    *
3af0: 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69  * pVector.  Typi
3b00: 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c  cally there will
3b10: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f   be multiple TK_
3b20: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b30: 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  des.    ** with 
3b40: 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70  the same pLeft p
3b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56  ointer to the pV
3b60: 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20  ector, but only 
3b70: 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  one of them.    
3b80: 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20  ** will own the 
3b90: 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  pVector..    */.
3ba0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
3bb0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
3bc0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3bd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
3be0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
3bf0: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3c00: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3c10: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3c20: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3c30: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3c40: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3c50: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3c60: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3c70: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3c80: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3c90: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3ca0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
3cb0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
3cc0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
3cd0: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
3ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
3cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70  .}../*.** If exp
3d00: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
3d10: 20 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45   of type TK_SELE
3d20: 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  CT, generate cod
3d30: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
3d40: 20 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20   it. Return the 
3d50: 72 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63  register in whic
3d60: 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  h the result is 
3d70: 73 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74  stored (or, if t
3d80: 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
3d90: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
3da0: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20  han one column, 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69  array.** of regi
3dd0: 73 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74  sters in which t
3de0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
3df0: 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  red)..**.** If p
3e00: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b  Expr is not a TK
3e10: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
3e20: 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  on, return 0..*/
3e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
3e40: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61  CodeSubselect(Pa
3e50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3e60: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
3e70: 20 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65   reg = 0;.#ifnde
3e80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3e90: 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78  BQUERY.  if( pEx
3ea0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
3eb0: 54 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73  T ){.    reg = s
3ec0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
3ed0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
3ee0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  r, 0, 0);.  }.#e
3ef0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65  ndif.  return re
3f00: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  g;.}../*.** Argu
3f10: 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69  ment pVector poi
3f20: 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20  nts to a vector 
3f30: 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74  expression - eit
3f40: 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a  her a TK_VECTOR.
3f50: 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20  ** or TK_SELECT 
3f60: 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72  that returns mor
3f70: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
3f80: 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
3f90: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
3fa0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
3fb0: 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68  of a register th
3fc0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3fd0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d  value of.** elem
3fe0: 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68  ent iField of th
3ff0: 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e vector..**.** 
4000: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
4010: 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73  TK_SELECT expres
4020: 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20  sion, then code 
4030: 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65  for it must have
4040: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65   .** already bee
4050: 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  n generated usin
4060: 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75  g the exprCodeSu
4070: 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  bselect() routin
4080: 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  e. In this.** ca
4090: 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67  se parameter reg
40a0: 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65  Select should be
40b0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
40c0: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
40d0: 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ers.** containin
40e0: 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
40f0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
4100: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74   .**.** If pVect
4110: 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  or is of type TK
4120: 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f  _VECTOR, then co
4130: 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65  de for the reque
4140: 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73  sted field.** is
4150: 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74   generated. In t
4160: 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46  his case (*pRegF
4170: 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20  ree) may be set 
4180: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4190: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
41a0: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66  register to be f
41b0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
41c0: 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
41d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ing..**.** Befor
41e0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74  e returning, out
41f0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a  put parameter (*
4200: 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74  ppExpr) is set t
4210: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a  o point to the.*
4220: 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f  * Expr object co
4230: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
4240: 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20  lement iElem of 
4250: 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73  the vector..*/.s
4260: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65  tatic int exprVe
4270: 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20  ctorRegister(.  
4280: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42a0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
42b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63   */.  Expr *pVec
42c0: 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  tor,            
42d0: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
42e0: 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65  to extract eleme
42f0: 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  nt from */.  int
4300: 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20   iField,        
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4320: 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74  Field to extract
4330: 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f   from pVector */
4340: 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74  .  int regSelect
4350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4360: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61     /* First in a
4370: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4380: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  s */.  Expr **pp
4390: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
43a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
43b0: 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e  xpression elemen
43c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67  t */.  int *pReg
43d0: 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
43e0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
43f0: 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
4400: 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  free */.){.  u8 
4410: 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70  op = pVector->op
4420: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
4430: 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d  TK_VECTOR || op=
4440: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20  =TK_REGISTER || 
4450: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
4460: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
4470: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70  GISTER ){.    *p
4480: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56  pExpr = sqlite3V
4490: 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
44a0: 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c  r(pVector, iFiel
44b0: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  d);.    return p
44c0: 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69  Vector->iTable+i
44d0: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28  Field;.  }.  if(
44e0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
44f0: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
4500: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
4510: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46  ct->pEList->a[iF
4520: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20  ield].pExpr;.   
4530: 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65    return regSele
4540: 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20  ct+iField;.  }. 
4550: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
4560: 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  or->x.pList->a[i
4570: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
4580: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4590: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
45a0: 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67  e, *ppExpr, pReg
45b0: 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Free);.}../*.** 
45c0: 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  Expression pExpr
45d0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
45e0: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63   between two vec
45f0: 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  tor values. Comp
4600: 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ute.** the resul
4610: 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  t of the compari
4620: 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55  son (1, 0, or NU
4630: 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68  LL) and write th
4640: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74  at.** result int
4650: 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e  o register dest.
4660: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4670: 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74  r must satisfy t
4680: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65  he following pre
4690: 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  conditions:.**.*
46a0: 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f  *    if pExpr->o
46b0: 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f  p==TK_IS:      o
46c0: 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d  p==TK_EQ and p5=
46d0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a  =SQLITE_NULLEQ.*
46e0: 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f  *    if pExpr->o
46f0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f  p==TK_ISNOT:   o
4700: 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d  p==TK_NE and p5=
4710: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a  =SQLITE_NULLEQ.*
4720: 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20  *    otherwise: 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
4740: 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  p==pExpr->op and
4750: 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63   p5==0.*/.static
4760: 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72   void codeVector
4770: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
4780: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4790: 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74   /* Code generat
47a0: 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  or context */.  
47b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
47c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
47d0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
47e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4800: 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e  Write results in
4810: 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
4820: 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20   */.  u8 op,    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4840: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
4850: 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  or */.  u8 p5   
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4870: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f   SQLITE_NULLEQ o
4880: 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56  r zero */.){.  V
4890: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
48a0: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
48b0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
48c0: 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52  Left;.  Expr *pR
48d0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
48e0: 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66  ight;.  int nLef
48f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
4900: 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
4910: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4920: 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20   regLeft = 0;.  
4930: 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30  int regRight = 0
4940: 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b  ;.  u8 opx = op;
4950: 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20  .  int addrDone 
4960: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4970: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66  eLabel(v);..  if
4980: 28 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33  ( nLeft!=sqlite3
4990: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
49a0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
49b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
49c0: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
49d0: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
49e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
49f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
4a00: 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d  =TK_EQ || pExpr-
4a10: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20  >op==TK_NE .    
4a20: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4a30: 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_IS || pExpr-
4a40: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
4a50: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
4a60: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78  op==TK_LT || pEx
4a70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20  pr->op==TK_GT . 
4a80: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
4a90: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78  op==TK_LE || pEx
4aa0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20  pr->op==TK_GE . 
4ab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
4ac0: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28  xpr->op==op || (
4ad0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4ae0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20   && op==TK_EQ). 
4af0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
4b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
4b10: 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29  OT && op==TK_NE)
4b20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35   );.  assert( p5
4b30: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  ==0 || pExpr->op
4b40: 21 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74  !=op );.  assert
4b50: 28 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  ( p5==SQLITE_NUL
4b60: 4c 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  LEQ || pExpr->op
4b70: 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d  ==op );..  p5 |=
4b80: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b   SQLITE_STOREP2;
4b90: 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c  .  if( opx==TK_L
4ba0: 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b  E ) opx = TK_LT;
4bb0: 0a 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47  .  if( opx==TK_G
4bc0: 45 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b  E ) opx = TK_GT;
4bd0: 0a 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78  ..  regLeft = ex
4be0: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4bf0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
4c00: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
4c10: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
4c20: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
4c30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a  .  for(i=0; 1 /*
4c40: 4c 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62  Loop exits by "b
4c50: 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20  reak"*/; i++){. 
4c60: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
4c70: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
4c80: 30 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c  0;.    Expr *pL,
4c90: 20 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72   *pR; .    int r
4ca0: 31 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72  1, r2;.    asser
4cb0: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65  t( i>=0 && i<nLe
4cc0: 66 74 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 65  ft );.    r1 = e
4cd0: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4ce0: 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
4cf0: 20 69 2c 20 72 65 67 4c 65 66 74 2c 20 26 70 4c   i, regLeft, &pL
4d00: 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
4d10: 20 20 72 32 20 3d 20 65 78 70 72 56 65 63 74 6f    r2 = exprVecto
4d20: 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  rRegister(pParse
4d30: 2c 20 70 52 69 67 68 74 2c 20 69 2c 20 72 65 67  , pRight, i, reg
4d40: 52 69 67 68 74 2c 20 26 70 52 2c 20 26 72 65 67  Right, &pR, &reg
4d50: 46 72 65 65 32 29 3b 0a 20 20 20 20 63 6f 64 65  Free2);.    code
4d60: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
4d70: 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31 2c  pL, pR, opx, r1,
4d80: 20 72 32 2c 20 64 65 73 74 2c 20 70 35 29 3b 0a   r2, dest, p5);.
4d90: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4da0: 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
4db0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4dc0: 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Lt);.    testca
4dd0: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
4de0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4df0: 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
4e00: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4e10: 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
4e20: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
4e30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4e40: 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
4e50: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4e60: 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74 65 73 74  OP_Ge);.    test
4e70: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
4e80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4e90: 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
4ea0: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4eb0: 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
4ec0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
4ed0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  e);.    sqlite3R
4ee0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4ef0: 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
4f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
4f10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4f20: 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
4f30: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31    if( i==nLeft-1
4f40: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
4f50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
4f60: 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  px==TK_EQ ){.   
4f70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4f90: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
4fa0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4fb0: 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20  v);.      p5 |= 
4fc0: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4fd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
4fe0: 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20  px==TK_NE ){.   
4ff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5000: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64  dOp2(v, OP_If, d
5010: 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20  est, addrDone); 
5020: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5030: 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c  .      p5 |= SQL
5040: 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20  ITE_KEEPNULL;.  
5050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5060: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54  ssert( op==TK_LT
5070: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c   || op==TK_GT ||
5080: 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70   op==TK_LE || op
5090: 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
50a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
50b0: 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74  p2(v, OP_ElseNot
50c0: 45 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29  Eq, 0, addrDone)
50d0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
50e0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
50f0: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LT);.      Vdbe
5100: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5110: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
5120: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5130: 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20  , op==TK_LE);.  
5140: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5150: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29  If(v, op==TK_GE)
5160: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  ;.      if( i==n
5170: 4c 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f  Left-2 ) opx = o
5180: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  p;.    }.  }.  s
5190: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
51a0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f  eLabel(v, addrDo
51b0: 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ne);.}..#if SQLI
51c0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
51d0: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
51e0: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
51f0: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
5200: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
5210: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
5220: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
5230: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
5240: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
5250: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
5260: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
5270: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
5280: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
5290: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
52a0: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
52b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
52c0: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
52d0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
52e0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
52f0: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
5300: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
5310: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5330: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
5340: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
5350: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
5360: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
5370: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
5380: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5390: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
53a0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
53b0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
53c0: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
53d0: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
53e0: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
53f0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5400: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
5410: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
5420: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
5430: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5440: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5450: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
5460: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
5470: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
5480: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
5490: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
54a0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
54b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
54c0: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
54d0: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
54e0: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
54f0: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
5500: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
5510: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
5520: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5530: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
5540: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5550: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5560: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
5570: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
5580: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
5590: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
55a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
55b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
55c0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
55d0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
55e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
55f0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5600: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
5610: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
5620: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
5630: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
5640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5650: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5660: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 53  elect(Select *pS
5670: 65 6c 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48 65  elect, int *pnHe
5680: 69 67 68 74 29 7b 0a 20 20 53 65 6c 65 63 74 20  ight){.  Select 
5690: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65 6c  *p;.  for(p=pSel
56a0: 65 63 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72  ect; p; p=p->pPr
56b0: 69 6f 72 29 7b 0a 20 20 20 20 68 65 69 67 68 74  ior){.    height
56c0: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
56d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
56e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
56f0: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
5700: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
5720: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5730: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5740: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
5750: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5760: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5770: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
5780: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5790: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
57a0: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
57b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
57c0: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
57d0: 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74  ht variable in t
57e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
57f0: 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72  sed as an .** ar
5800: 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65  gument. An expre
5810: 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68  ssion with no ch
5820: 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69  ildren, Expr.pLi
5830: 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70  st or .** Expr.p
5840: 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61  Select member ha
5850: 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e  s a height of 1.
5860: 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
5870: 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68  ssion.** has a h
5880: 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74  eight equal to t
5890: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
58a0: 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a  t of any other .
58b0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78  ** referenced Ex
58c0: 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a  pr plus one..**.
58d0: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
58e0: 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  e EP_Propagate f
58f0: 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70  lags up from Exp
5900: 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70  r.x.pList to Exp
5910: 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61  r.flags,.** if a
5920: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
5940: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
5950: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
5960: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
5970: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
5980: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5990: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
59a0: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
59b0: 20 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 53   if( p->eX==EX_S
59c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 68 65 69  elect ){.    hei
59d0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
59e0: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
59f0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ht);.  }else if(
5a00: 20 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20   p->eX==EX_List 
5a10: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5a20: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5a30: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5a40: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5a50: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5a60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5a70: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5a80: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5a90: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5ab0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5ac0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5ad0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5ae0: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5af0: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5b00: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5b10: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5b20: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5b30: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5b40: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5b50: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5b60: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5b70: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5b80: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5b90: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5ba0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5bb0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5bc0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5bd0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5be0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  p){.  if( p==0 |
5bf0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
5c00: 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53   return;.  exprS
5c10: 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73  etHeight(p);.  s
5c20: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
5c30: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
5c40: 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  >nHeight);.}../*
5c50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
5c60: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
5c70: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5c80: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a  tree referenced.
5c90: 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74  ** by the select
5ca0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5cb0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
5cc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5cd0: 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
5ce0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
5cf0: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5d00: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5d10: 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  (p, &nHeight);. 
5d20: 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b   return nHeight;
5d30: 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56  .}.#else /* ABOV
5d40: 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72  E:  Height enfor
5d50: 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20  cement enabled. 
5d60: 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65   BELOW: Height e
5d70: 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a  nforcement off *
5d80: 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74  /./*.** Propagat
5d90: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
5da0: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
5db0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
5dc0: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
5dd0: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
5de0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
5df0: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
5e00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
5e10: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  {.  if( p && p->
5e20: 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 7b 0a 20  eX==EX_List ){. 
5e30: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5e40: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5e50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5e60: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5e70: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78    }.}.#define ex
5e80: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
5e90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5ea0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5eb0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
5ec0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5ed0: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
5ee0: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
5ef0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5f00: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
5f10: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
5f20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
5f30: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
5f40: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
5f50: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
5f60: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
5f70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
5f80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5f90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
5fa0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
5fb0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
5fc0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
5fd0: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
5fe0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
5ff0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
6000: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
6010: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
6020: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
6030: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
6040: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
6050: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
6060: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  g is performed. 
6070: 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20   The deQuote.** 
6080: 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
6090: 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69  ored if pToken i
60a0: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
60b0: 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a   token does not.
60c0: 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ** appear to be 
60d0: 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20  quoted.  If the 
60e0: 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74  quotes were of t
60f0: 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64  he form "..." (d
6100: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a  ouble-quotes).**
6110: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c   then the EP_Dbl
6120: 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73  Quoted flag is s
6130: 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  et on the expres
6140: 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sion node..**.**
6150: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6160: 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  If op==TK_INTEGE
6170: 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69  R and pToken poi
6180: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
6190: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74  that.** can be t
61a0: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
61b0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
61c0: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
61d0: 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64  is not.** stored
61e0: 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49   in u.zToken.  I
61f0: 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65  nstead, the inte
6200: 67 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72  ger values is wr
6210: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e  itten.** into u.
6220: 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45  iValue and the E
6230: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
6240: 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72  is set.  No extr
6250: 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20  a storage.** is 
6260: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
6270: 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65  d the integer te
6280: 78 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f  xt and the dequo
6290: 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72  te flag is ignor
62a0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
62b0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20  ite3ExprAlloc(. 
62c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
62d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
62e0: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
62f0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f  MallocRawNN() */
6300: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6320: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
6330: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
6340: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
6350: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6360: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6370: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6390: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
63a0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
63b0: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
63c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
63d0: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
63e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
63f0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
6400: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
6410: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
6420: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
6430: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
6440: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
6450: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
6460: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
6470: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
6480: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
6490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
64a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
64b0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
64c0: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
64d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
64e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
64f0: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
6500: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
6510: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
6520: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
6530: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
6540: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
6550: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
6560: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
6570: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65  P_IntValue|EP_Le
6580: 61 66 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  af;.        pNew
6590: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
65a0: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
65b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
65c0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
65d0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
65f0: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
6600: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
6610: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
6620: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
6630: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
6640: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
6650: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
6660: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
6670: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
6680: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
6690: 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70  sqlite3Isquote(p
66a0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  New->u.zToken[0]
66b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
66c0: 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  f( pNew->u.zToke
66d0: 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77  n[0]=='"' ) pNew
66e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
66f0: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
6700: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
6710: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
6720: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6730: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53     }.    }.#if S
6740: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
6750: 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d  EPTH>0.    pNew-
6760: 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65  >nHeight = 1;.#e
6770: 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74  ndif  .  }.  ret
6780: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
6790: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
67a0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
67b0: 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65  e from a zero-te
67c0: 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74  rminated token t
67d0: 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61  hat has.** alrea
67e0: 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64  dy been dequoted
67f0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
6800: 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  e3Expr(.  sqlite
6810: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6820: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6830: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6840: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
6850: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6880: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
6890: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20   char *zToken   
68a0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
68b0: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
68c0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  NULL */.){.  Tok
68d0: 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54  en x;.  x.z = zT
68e0: 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71  oken;.  x.n = sq
68f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6900: 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
6910: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6920: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6940: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6950: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
6960: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
6970: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
6980: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
6990: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
69a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
69b0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
69c0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
69d0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
69e0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
69f0: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
6a00: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
6a10: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
6a20: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6a30: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6a40: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
6a50: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
6a60: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
6a70: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
6a80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
6a90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6aa0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
6ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6ac0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
6ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
6ae0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
6af0: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
6b00: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
6b10: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6b20: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6b30: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6b40: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
6b50: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6b60: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
6b70: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6b80: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6b90: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
6ba0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
6bb0: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
6bc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6bd0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
6be0: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
6bf0: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
6c00: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
6c10: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
6c20: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6c30: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6c40: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
6c50: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
6c60: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
6c70: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6c80: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
6c90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
6ca0: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
6cb0: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
6cc0: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
6cd0: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
6ce0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6cf0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6d00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6d10: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6d20: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6d30: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6d40: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6d60: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6d70: 70 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20  pr *pRight      
6d80: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
6d90: 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45  perand */.){.  E
6da0: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
6db0: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72  ==TK_AND && pPar
6dc0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
6dd0: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
6de0: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
6df0: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
6e00: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
6e10: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
6e20: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
6e30: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
6e40: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6e50: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
6e60: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
6e70: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
6e80: 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Expr));.    if( 
6e90: 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  p ){.      memse
6ea0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  t(p, 0, sizeof(E
6eb0: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xpr));.      p->
6ec0: 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f  op = op & TKFLG_
6ed0: 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  MASK;.      p->i
6ee0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Agg = -1;.    }.
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
6f00: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
6f10: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
6f20: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
6f30: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
6f40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
6f50: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
6f60: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
6f70: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6f80: 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63  /*.** Add pSelec
6f90: 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e  t to the Expr.x.
6fa0: 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20  pSelect field.  
6fb0: 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  Or, if pExpr is 
6fc0: 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20  NULL (due.** do 
6fd0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6fe0: 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65  ion failure) the
6ff0: 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65  n delete the pSe
7000: 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
7010: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70  void sqlite3PExp
7020: 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65  rAddSelect(Parse
7030: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7040: 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70  pExpr, Select *p
7050: 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70  Select){.  if( p
7060: 45 78 70 72 20 26 26 20 70 53 65 6c 65 63 74 20  Expr && pSelect 
7070: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7080: 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e  Expr->eX==EX_Non
7090: 65 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  e );.    pExpr->
70a0: 65 58 20 3d 20 45 58 5f 53 65 6c 65 63 74 3b 0a  eX = EX_Select;.
70b0: 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65      pExpr->x.pSe
70c0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
70d0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
70e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
70f0: 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  bquery);.    sql
7100: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7110: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7120: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  , pExpr);.  }els
7130: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7140: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7150: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
7160: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
7170: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7180: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Select);.  }.}..
7190: 2f 2a 0a 2a 2a 20 41 64 64 20 45 78 70 72 4c 69  /*.** Add ExprLi
71a0: 73 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  st to the Expr.x
71b0: 2e 70 4c 69 73 74 20 66 69 65 6c 64 2e 20 20 4f  .pList field.  O
71c0: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
71d0: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
71e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
71f0: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
7200: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
7210: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
7220: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
7230: 41 64 64 45 78 70 72 4c 69 73 74 28 50 61 72 73  AddExprList(Pars
7240: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
7250: 2a 70 45 78 70 72 2c 20 45 78 70 72 4c 69 73 74  *pExpr, ExprList
7260: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
7270: 70 45 78 70 72 20 26 26 20 70 4c 69 73 74 20 29  pExpr && pList )
7280: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
7290: 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65  xpr->eX==EX_None
72a0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 65   );.    pExpr->e
72b0: 58 20 3d 20 45 58 5f 4c 69 73 74 3b 0a 20 20 20  X = EX_List;.   
72c0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
72d0: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 2f 2a 20  = pList;.    /* 
72e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
72f0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7300: 72 73 65 2c 20 70 45 78 70 72 29 3b 20 2f 2f 20  rse, pExpr); // 
7310: 64 6f 6e 65 20 62 79 20 63 61 6c 6c 65 72 20 2a  done by caller *
7320: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  /.  }else{.    a
7330: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7350: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7360: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
7370: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
7380: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
7390: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
73a0: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
73b0: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
73c0: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
73d0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
73e0: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
73f0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
7400: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
7410: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
7420: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7430: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
7440: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7450: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7460: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7470: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7490: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
74a0: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
74b0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
74c0: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
74d0: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
74e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
74f0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
7500: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
7510: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
7520: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7530: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7540: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7550: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7560: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7570: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7580: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7590: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
75a0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
75b0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
75c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
75d0: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
75e0: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
75f0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
7600: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
7610: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
7620: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7630: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7640: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7650: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7660: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7670: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7680: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7690: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
76a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
76b0: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
76c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
76d0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
76e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
76f0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7700: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7710: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7720: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7730: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7750: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7760: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7770: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7780: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7790: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
77a0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
77b0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
77c0: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
77d0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
77e0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
77f0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
7800: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
7810: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
7820: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7830: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7840: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7850: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7860: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7870: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7880: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7890: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
78a0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
78b0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
78c0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
78d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
78e0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
78f0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
7900: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
7910: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
7920: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7930: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7950: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7970: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7980: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7990: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
79a0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
79b0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
79c0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
79d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
79e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
79f0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
7a00: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7a10: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
7a20: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7a30: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7a40: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7a60: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7a70: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7a80: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7a90: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7aa0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7ab0: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7ac0: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
7ad0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
7ae0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7af0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7b00: 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41  pList,      /* A
7b10: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
7b20: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c    Token *pToken,
7b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7b40: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
7b50: 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e  */.  int eDistin
7b60: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46  ct         /* SF
7b70: 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f  _Distinct or SF_
7b80: 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  ALL or 0 */.){. 
7b90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73   Expr *pNew;.  s
7ba0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7bb0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
7bc0: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
7bd0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7be0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55  rAlloc(db, TK_FU
7bf0: 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20  NCTION, pToken, 
7c00: 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  1);.  if( pNew==
7c10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7c20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7c30: 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  b, pList); /* Av
7c40: 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  oid memory leak 
7c50: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
7c60: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7c70: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
7c80: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78  st && pList->nEx
7c90: 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d  pr > pParse->db-
7ca0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7cb0: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
7cc0: 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  G] ){.    sqlite
7cd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ce0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
7cf0: 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f  ments on functio
7d00: 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  n %T", pToken);.
7d10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
7d20: 65 77 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20  ew->eX==EX_None 
7d30: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
7d40: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 65 58 20 3d  {.    pNew->eX =
7d50: 20 45 58 5f 4c 69 73 74 3b 0a 20 20 20 20 70 4e   EX_List;.    pN
7d60: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7d70: 69 73 74 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53  ist;.  }.  ExprS
7d80: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  etProperty(pNew,
7d90: 20 45 50 5f 48 61 73 46 75 6e 63 29 3b 0a 20 20   EP_HasFunc);.  
7da0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
7db0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
7dc0: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  rse, pNew);.  if
7dd0: 28 20 65 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f  ( eDistinct==SF_
7de0: 44 69 73 74 69 6e 63 74 20 29 20 45 78 70 72 53  Distinct ) ExprS
7df0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  etProperty(pNew,
7e00: 20 45 50 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20   EP_Distinct);. 
7e10: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7e20: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
7e30: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7e40: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7e50: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
7e60: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
7e70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7e80: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
7e90: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
7ea0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
7eb0: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
7ec0: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
7ed0: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
7ee0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
7ef0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7f00: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
7f10: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
7f20: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
7f30: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
7f40: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
7f50: 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20 61 20   big to avoid a 
7f60: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
7f70: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
7f80: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7f90: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
7fa0: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
7fb0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
7fc0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
7fd0: 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72  aaa", "@aaa", or
7fe0: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
7ff0: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
8000: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
8010: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
8020: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
8030: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
8040: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
8050: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
8060: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
8070: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
8080: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
8090: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
80a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
80b0: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
80c0: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
80d0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
80e0: 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65  u32 n){.  sqlite
80f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8100: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
8110: 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a   *z;.  ynVar x;.
8120: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
8130: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8140: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8150: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
8160: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
8170: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
8180: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
8190: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
81a0: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
81b0: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
81c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28  ;.  assert( n==(
81d0: 75 33 32 29 73 71 6c 69 74 65 33 53 74 72 6c 65  u32)sqlite3Strle
81e0: 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20  n30(z) );.  if( 
81f0: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
8200: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
8210: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
8220: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
8230: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
8240: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
8250: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d  =='?' );.    x =
8260: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8270: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73  e->nVar);.  }els
8280: 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64  e{.    int doAdd
8290: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b   = 0;.    if( z[
82a0: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
82b0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
82c0: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
82d0: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
82e0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
82f0: 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69  d.      ** use i
8300: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
8310: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
8320: 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69    i64 i;.      i
8330: 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66  nt bOk;.      if
8340: 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49  ( n==2 ){ /*OPTI
8350: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45  MIZATION-IF-TRUE
8360: 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d 20 7a  */.        i = z
8370: 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65  [1]-'0';  /* The
8380: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
8390: 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ?N for a single 
83a0: 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20  digit N */.     
83b0: 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
83c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
83d0: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
83e0: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
83f0: 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55  i, n-1, SQLITE_U
8400: 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
8410: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
8420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
8430: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
8440: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
8450: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
8460: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8470: 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20  E_NUMBER]-1 );. 
8480: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
8490: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
84a0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
84b0: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
84c0: 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c      if( bOk==0 |
84d0: 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  | i<1 || i>db->a
84e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
84f0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8500: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ER] ){.        s
8510: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8520: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
8530: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
8540: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
8550: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
8560: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
8570: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8580: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
8590: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
85a0: 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20 28 79    }.      x = (y
85b0: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 69 66  nVar)i;.      if
85c0: 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( x>pParse->nVar
85d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
85e0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
85f0: 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  x;.        doAdd
8600: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8610: 65 20 69 66 28 20 73 71 6c 69 74 65 33 56 4c 69  e if( sqlite3VLi
8620: 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72  stNumToName(pPar
8630: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d  se->pVList, x)==
8640: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 41  0 ){.        doA
8650: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8670: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
8680: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
8690: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
86a0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
86b0: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
86c0: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
86d0: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
86e0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
86f0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
8700: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
8710: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
8720: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
8730: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
8740: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
8750: 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71 6c 69   x = (ynVar)sqli
8760: 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75  te3VListNameToNu
8770: 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  m(pParse->pVList
8780: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  , z, n);.      i
8790: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
87a0: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
87b0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
87c0: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
87d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
87e0: 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64 20 29  .    if( doAdd )
87f0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
8800: 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pVList = sqlite3
8810: 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70 50 61  VListAdd(db, pPa
8820: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8830: 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  n, x);.    }.  }
8840: 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  .  pExpr->iColum
8850: 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78 3e 64  n = x;.  if( x>d
8860: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8870: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8880: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
8890: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
88a0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
88b0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
88c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
88d0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
88e0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
88f0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
8900: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8910: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8920: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
8930: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
8940: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
8950: 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ;.  /* Sanity ch
8960: 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74  eck: Assert that
8970: 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73   the IntValue is
8980: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66   non-negative if
8990: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
89a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
89b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
89c0: 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75  ntValue) || p->u
89d0: 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20  .iValue>=0 );.  
89e0: 61 73 73 65 72 74 28 20 70 2d 3e 65 58 21 3d 45  assert( p->eX!=E
89f0: 58 5f 53 65 6c 65 63 74 20 7c 7c 20 70 2d 3e 78  X_Select || p->x
8a00: 2e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  .pSelect!=0 );. 
8a10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 58 21 3d   assert( p->eX!=
8a20: 45 58 5f 4c 69 73 74 20 7c 7c 20 70 2d 3e 78 2e  EX_List || p->x.
8a30: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 64  pList!=0 );.#ifd
8a40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8a50: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8a60: 70 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66  perty(p, EP_Leaf
8a70: 29 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  ) && !ExprHasPro
8a80: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8a90: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73  nOnly) ){.    as
8aa0: 73 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d  sert( p->pLeft==
8ab0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8ac0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8ad0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8ae0: 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20 29 3b 0a 20  eX==EX_None );. 
8af0: 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61   }.  if( !ExprHa
8b00: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8b10: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
8b20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
8b30: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
8b40: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
8b50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8b60: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 78 2e  ight==0 || p->x.
8b70: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
8b80: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
8b90: 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f  Property(p, (EP_
8ba0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
8bb0: 75 63 65 64 29 29 20 29 7b 0a 20 20 20 20 61 73  uced)) ){.    as
8bc0: 73 65 72 74 28 20 70 2d 3e 70 57 69 6e 3d 3d 30  sert( p->pWin==0
8bd0: 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20   || p->pLeft==0 
8be0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8bf0: 2d 3e 70 57 69 6e 3d 3d 30 20 7c 7c 20 70 2d 3e  ->pWin==0 || p->
8c00: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 61  pTab==0 );.    a
8c10: 73 73 65 72 74 28 20 70 2d 3e 70 57 69 6e 3d 3d  ssert( p->pWin==
8c20: 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  0 || p->op==TK_F
8c30: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 61  UNCTION );.    a
8c40: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 3d 3d  ssert( p->pTab==
8c50: 30 20 7c 7c 20 28 70 2d 3e 70 52 69 67 68 74 3d  0 || (p->pRight=
8c60: 3d 30 20 26 26 20 70 2d 3e 65 58 3d 3d 45 58 5f  =0 && p->eX==EX_
8c70: 4e 6f 6e 65 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  None) );.  }.#en
8c80: 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48  dif.  if( !ExprH
8c90: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45  asProperty(p, (E
8ca0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
8cb0: 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  eaf)) ){.    /* 
8cc0: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
8cd0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
8ce0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
8cf0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
8d00: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8d10: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
8d20: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
8d30: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
8d40: 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c  && p->op!=TK_SEL
8d50: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c  ECT_COLUMN ) sql
8d60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8d70: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
8d80: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
8d90: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8da0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8db0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
8dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8dd0: 73 77 69 74 63 68 28 20 70 2d 3e 65 58 20 29 7b  switch( p->eX ){
8de0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 45 58  .        case EX
8df0: 5f 53 65 6c 65 63 74 3a 20 7b 0a 20 20 20 20 20  _Select: {.     
8e00: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
8e10: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
8e20: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
8e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
8e50: 61 73 65 20 45 58 5f 4c 69 73 74 3a 20 7b 0a 20  ase EX_List: {. 
8e60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8e70: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
8e80: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
8e90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8ea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8eb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8ec0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8ed0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
8ee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ef0: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62  3WindowDelete(db
8f00: 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20 20 20  , p->pWin);.    
8f10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  }.  }.  if( Expr
8f20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8f30: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
8f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8f50: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
8f60: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8f70: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
8f80: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
8f90: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
8fa0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
8fb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73  ite3ExprDelete(s
8fc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8fd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20   *p){.  if( p ) 
8fe0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8ff0: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  eNN(db, p);.}../
9000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9010: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9020: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
9030: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
9040: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
9050: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
9060: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
9070: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
9080: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
9090: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
90a0: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
90b0: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
90c0: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
90d0: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
90e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
90f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
9100: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
9110: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9120: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
9130: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9140: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
9150: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
9160: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
9170: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
9180: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
9190: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
91a0: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
91b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
91c0: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
91d0: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
91e0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
91f0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
9200: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
9210: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
9220: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
9230: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
9240: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
9250: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
9260: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
9270: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
9280: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
9290: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
92a0: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
92b0: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
92c0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
92d0: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
92e0: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
92f0: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
9300: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
9310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9350: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
9360: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
9370: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9380: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
9390: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
93a0: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
93b0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
93c0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
93d0: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
93e0: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
93f0: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
9400: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
9410: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
9420: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
9430: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
9440: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
9450: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
9460: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
9470: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
9480: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
9490: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
94a0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
94b0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
94c0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
94d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
94e0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
94f0: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
9500: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
9510: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
9520: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
9530: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
9540: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
9550: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
9560: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
9570: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
9580: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
9590: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
95a0: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
95b0: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
95c0: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
95d0: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
95e0: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
95f0: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
9600: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
9610: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
9620: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
9630: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
9640: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
9650: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
9660: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
9670: 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65  of the Expr obje
9680: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
9690: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
96a0: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
96b0: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
96c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
96d0: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
96e0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
96f0: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
9700: 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55   an EXPRDUP_REDU
9710: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
9720: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
9730: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
9740: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
9750: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
9760: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
9770: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
9780: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
9790: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
97a0: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
97b0: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
97c0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
97d0: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
97e0: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
97f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
9800: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9810: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
9820: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9830: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
9840: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
9850: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9860: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
9870: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
9880: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
9890: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52  /.  assert( EXPR
98a0: 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66  _FULLSIZE<=0xfff
98b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30   );.  assert( (0
98c0: 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63  xfff & (EP_Reduc
98d0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
98e0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d  )==0 );.  if( 0=
98f0: 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d  =flags || p->op=
9900: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
9910: 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  N .#ifndef SQLIT
9920: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
9930: 43 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69 6e 20  C.   || p->pWin 
9940: 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
9950: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
9960: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LLSIZE;.  }else{
9970: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9980: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9990: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
99a0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
99b0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
99c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
99d0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20  FromJoin) ); .  
99e0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
99f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9a00: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20  _MemToken) );.  
9a10: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9a20: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9a30: 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20  _NoReduce) );.  
9a40: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
9a50: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
9a60: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
9a70: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
9a80: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
9a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
9aa0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
9ab0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 );.      nSiz
9ac0: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
9ad0: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9ae0: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
9af0: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
9b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9b10: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9b20: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
9b30: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
9b40: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
9b50: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
9b60: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
9b70: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
9b80: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9b90: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
9ba0: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
9bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9bc0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
9bd0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9be0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9bf0: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
9c00: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
9c10: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
9c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9c30: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
9c40: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
9c50: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
9c60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9c70: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
9c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
9c90: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
9ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9cb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
9cc0: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
9cd0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
9ce0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
9cf0: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
9d00: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9d10: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9d20: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9d30: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9d40: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9d50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
9d60: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9d70: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
9d80: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
9d90: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
9da0: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
9db0: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
9dc0: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
9dd0: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
9de0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
9df0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
9e00: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
9e10: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9e20: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9e30: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9e40: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9e50: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
9e60: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
9e70: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
9e80: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
9e90: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
9ea0: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
9eb0: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
9ec0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
9ed0: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
9ee0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
9ef0: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
9f00: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
9f10: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9f20: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9f30: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
9f40: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
9f50: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9f60: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
9f70: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
9f80: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
9f90: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
9fa0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
9fb0: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
9fc0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
9fd0: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
9fe0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9ff0: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
a000: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a010: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
a020: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
a030: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
a040: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
a050: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
a060: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
a070: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
a080: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
a090: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
a0a0: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
a0b0: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
a0c0: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
a0d0: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
a0e0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
a0f0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
a100: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
a110: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
a120: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
a130: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
a140: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
a150: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
a160: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
a170: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
a180: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
a190: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
a1a0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
a1b0: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
a1c0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
a1d0: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
a1e0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
a1f0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
a200: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
a210: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
a220: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
a230: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
a240: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
a250: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
a260: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
a270: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
a280: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
a290: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
a2a0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
a2b0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
a2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
a2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
a2e0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
a2f0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
a300: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
a310: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
a320: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
a330: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
a340: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
a350: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
a360: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
a370: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
a380: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
a390: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
a3a0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
a3b0: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
a3c0: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
a3d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a3e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
a3f0: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
a400: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
a410: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
a420: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
a430: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
a440: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
a450: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
a460: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
a470: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
a480: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
a490: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
a4a0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
a4b0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
a4c0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
a4d0: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
a4e0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
a4f0: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
a500: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a510: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
a520: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
a530: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
a540: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
a550: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
a560: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
a570: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
a580: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
a590: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a5a0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
a5b0: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
a5c0: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
a5d0: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
a5e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a5f0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
a600: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
a610: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
a620: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a630: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
a640: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
a650: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a660: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
a670: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
a680: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
a690: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a6a0: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
a6b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a6c0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
a6d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a6e0: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
a6f0: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
a700: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
a710: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a720: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
a730: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
a740: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
a750: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
a760: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
a770: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
a780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a790: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
a7a0: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
a7b0: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
a7c0: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
a7d0: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
a7e0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a7f0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
a800: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a810: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
a820: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
a830: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
a840: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
a850: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
a860: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a870: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
a880: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
a890: 2d 3e 65 58 3d 3d 70 2d 3e 65 58 20 29 3b 0a 20  ->eX==p->eX );. 
a8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
a8b0: 3e 65 56 3d 3d 70 2d 3e 65 56 20 29 3b 0a 0a 20  >eV==p->eV );.. 
a8c0: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a8d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a8e0: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a8f0: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a900: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a910: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a920: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a930: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a940: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a950: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a960: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a970: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a980: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a990: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a9a0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a9b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a9c0: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a9d0: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a9e0: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a9f0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
aa00: 20 70 2d 3e 65 58 20 29 7b 0a 20 20 20 20 20 20   p->eX ){.      
aa10: 20 20 63 61 73 65 20 45 58 5f 53 65 6c 65 63 74    case EX_Select
aa20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  : {.          as
aa30: 73 65 72 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d  sert( pNew->eX==
aa40: 45 58 5f 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  EX_Select );.   
aa50: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
aa60: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
aa70: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
aa80: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46  >x.pSelect, dupF
aa90: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
aaa0: 20 69 66 28 20 70 4e 65 77 2d 3e 78 2e 70 53 65   if( pNew->x.pSe
aab0: 6c 65 63 74 3d 3d 30 20 29 20 70 4e 65 77 2d 3e  lect==0 ) pNew->
aac0: 65 58 20 3d 20 45 58 5f 4e 6f 6e 65 3b 0a 20 20  eX = EX_None;.  
aad0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aaf0: 20 63 61 73 65 20 45 58 5f 4c 69 73 74 3a 20 7b   case EX_List: {
ab00: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ab10: 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d 45 58 5f  t( pNew->eX==EX_
ab20: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
ab30: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
ab40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ab50: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
ab60: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
ab70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
ab80: 65 77 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29  ew->x.pList==0 )
ab90: 20 70 4e 65 77 2d 3e 65 58 20 3d 20 45 58 5f 4e   pNew->eX = EX_N
aba0: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  one;.          b
abb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
abc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
abd0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
abe0: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
abf0: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
ac00: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
ac10: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
ac20: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
ac30: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
ac40: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
ac50: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
ac60: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
ac70: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
ac80: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
ac90: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
aca0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
acb0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
acc0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
acd0: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
ace0: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
acf0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
ad00: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
ad10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
ad20: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
ad30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad40: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
ad50: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
ad60: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
ad70: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
ad80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ad90: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
ada0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
adb0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
adc0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
add0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
ade0: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
adf0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
ae00: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
ae10: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
ae20: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
ae30: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
ae40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ae50: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69  New->pWin = sqli
ae60: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
ae70: 20 70 4e 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b   pNew, p->pWin);
ae80: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
ae90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
aea0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
aeb0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
aec0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
aed0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
aee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
aef0: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
af00: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
af10: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
af20: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
af30: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
af40: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
af50: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
af60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
af70: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
af80: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
af90: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
afa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
afb0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
afc0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
afd0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
afe0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
aff0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
b000: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
b010: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
b020: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
b030: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b040: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
b050: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
b060: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
b070: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
b080: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
b090: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
b0a0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
b0b0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
b0c0: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
b0d0: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
b0e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b0f0: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
b100: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b110: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
b120: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
b130: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
b140: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
b150: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
b160: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
b170: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
b180: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
b190: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
b1a0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
b1b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
b1c0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
b1d0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
b1e0: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
b1f0: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
b200: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b210: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
b220: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
b230: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
b240: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
b250: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
b260: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
b270: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
b280: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b290: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
b2a0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
b2b0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
b2c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
b2d0: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
b2e0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
b2f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
b300: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
b310: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
b320: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
b330: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
b340: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
b350: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
b360: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
b370: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
b380: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
b390: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
b3a0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
b3b0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
b3c0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
b3d0: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
b3e0: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
b3f0: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
b400: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
b410: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
b420: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
b430: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
b440: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
b450: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
b460: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
b470: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
b480: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b490: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
b4a0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
b4b0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
b4c0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b4d0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b4e0: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b4f0: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b500: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b510: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b520: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b530: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b540: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b550: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b560: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b570: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b580: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b590: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b5a0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b5b0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b5c0: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b5d0: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b5e0: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b5f0: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b600: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b610: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b620: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b630: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b640: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b650: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b660: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b670: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b680: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b690: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b6a0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b6b0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b6c0: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b6d0: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b6e0: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b6f0: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b700: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b710: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b720: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b730: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b740: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b750: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b760: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b770: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b780: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b790: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b7a0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b7b0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b7c0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b7d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b7e0: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b7f0: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b800: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b810: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b820: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b830: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b840: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b850: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b870: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b880: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b890: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b8a0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b8b0: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b8c0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b8d0: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b8e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b8f0: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b900: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b910: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b920: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b930: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b940: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b950: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b960: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b970: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b980: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b990: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b9a0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b9b0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
b9c0: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
b9d0: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
b9e0: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
b9f0: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
ba00: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
ba10: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
ba20: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ba30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ba40: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
ba50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ba60: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
ba70: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
ba80: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
ba90: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
baa0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
bab0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
bac0: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
bad0: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
bae0: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
baf0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
bb00: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
bb10: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
bb20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
bb30: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
bb40: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bb50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
bb60: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
bb70: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
bb80: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bb90: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
bba0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
bbb0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
bbc0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
bbd0: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
bbe0: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
bbf0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
bc00: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
bc10: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
bc20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
bc30: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
bc40: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
bc50: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
bc60: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
bc70: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
bc80: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
bc90: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
bca0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
bcb0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
bcc0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
bcd0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bce0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
bcf0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
bd00: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
bd10: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
bd20: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
bd30: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
bd40: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
bd50: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
bd60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bd70: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
bd80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bd90: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
bda0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bdb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
bdc0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
bdd0: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
bde0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
bdf0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
be00: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
be10: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
be20: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
be30: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
be40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
be50: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
be60: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
be70: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
be80: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
be90: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
bea0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
beb0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
bec0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bed0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bee0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
bef0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
bf00: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
bf10: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
bf20: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
bf30: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
bf40: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
bf50: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
bf60: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bf70: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bf80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bf90: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bfa0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
bfb0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
bfc0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
bfd0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bfe0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bff0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
c000: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c010: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c020: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c030: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c040: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
c050: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c060: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c070: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
c080: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
c090: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
c0a0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
c0b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
c0c0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
c0d0: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
c0e0: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
c0f0: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
c100: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
c110: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
c120: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
c130: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
c140: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
c150: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
c160: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
c170: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c180: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
c190: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
c1a0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
c1b0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
c1c0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
c1d0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
c1e0: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
c1f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
c200: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
c210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c220: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
c230: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
c240: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
c250: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
c260: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
c270: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
c280: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
c290: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
c2a0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
c2b0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
c2c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c2d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c2e0: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
c2f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c300: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
c310: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
c320: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
c330: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c340: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
c350: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
c360: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
c370: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
c380: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
c390: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
c3a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c3b0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
c3c0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
c3d0: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
c3e0: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
c3f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
c400: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c410: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c420: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
c430: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c440: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
c450: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
c460: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
c470: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
c480: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
c490: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c4a0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
c4b0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
c4c0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c4d0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c4e0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c4f0: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c500: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c510: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c520: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c530: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c540: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c550: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c560: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c570: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c580: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c590: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c5a0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c5b0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c5c0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c5d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c5e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c5f0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c600: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c610: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c620: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c630: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c640: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c650: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c660: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c670: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c680: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c690: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c6a0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c6b0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c6c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c6d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c6e0: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c6f0: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c700: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c710: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c720: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c730: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c740: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c750: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c760: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c770: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c780: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c790: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c7a0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c7b0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c7c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c7d0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c7e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c7f0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c800: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c810: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c820: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c830: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c840: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c850: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c860: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c870: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c880: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c890: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c8a0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c8b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c8c0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c8d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c8e0: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c8f0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c900: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c910: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c920: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c930: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c940: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c950: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c960: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c970: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c980: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c990: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c9a0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
c9b0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
c9c0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
c9d0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
c9e0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
c9f0: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
ca00: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
ca10: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
ca20: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ca30: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
ca40: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
ca50: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
ca60: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
ca70: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
ca80: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
ca90: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
caa0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
cac0: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
cad0: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
cae0: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
caf0: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
cb00: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
cb10: 66 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  fn);.#endif.    
cb20: 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d  pNew->selId = p-
cb30: 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20  >selId;.    *pp 
cb40: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d  = pNew;.    pp =
cb50: 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a   &pNew->pPrior;.
cb60: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77      pNext = pNew
cb70: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
cb80: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pRet;.}.#else.Se
cb90: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
cba0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
cbb0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
cbc0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
cbd0: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
cbe0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
cbf0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
cc00: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
cc10: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
cc20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
cc30: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
cc40: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
cc50: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
cc60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
cc70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74  .**.** The pList
cc80: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
cc90: 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  e either NULL or
cca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
ccb0: 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74   ExprList.** obt
ccc0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69  ained from a pri
ccd0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
cce0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ccf0: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
cd00: 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20  e.** may not be 
cd10: 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78 70  used with an Exp
cd20: 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66  rList obtained f
cd30: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  rom sqlite3ExprL
cd40: 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61  istDup()..** Rea
cd50: 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69  son:  This routi
cd60: 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ne assumes that 
cd70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
cd80: 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ots in pList->a[
cd90: 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20  ].** is a power 
cda0: 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73  of two.  That is
cdb0: 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65   true for sqlite
cdc0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
cdd0: 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74  ) returns.** but
cde0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
cdf0: 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68  ily true from th
ce00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
ce10: 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  f sqlite3ExprLis
ce20: 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tDup()..**.** If
ce30: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
ce40: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
ce50: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
ce60: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
ce70: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
ce80: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
ce90: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
cea0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
ceb0: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
cec0: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
ced0: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
cee0: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
cef0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
cf00: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
cf10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cf20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
cf30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
cf40: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
cf50: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
cf60: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
cf70: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cf80: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
cf90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
cfa0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cfb0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
cfc0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
cfd0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cfe0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
cff0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d000: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d010: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
d020: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
d030: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d040: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
d050: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
d060: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
d070: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
d080: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
d090: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
d0a0: 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  xpr = 0;.  }else
d0b0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
d0c0: 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78  pr & (pList->nEx
d0d0: 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pr-1))==0 ){.   
d0e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
d0f0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
d100: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
d110: 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20   pList, .       
d120: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
d130: 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e  ist)+(2*pList->n
d140: 45 78 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66  Expr - 1)*sizeof
d150: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
d160: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
d170: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
d180: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
d190: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
d1a0: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
d1b0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d1c0: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
d1d0: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
d1e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d1f0: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
d200: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
d210: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
d220: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d230: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
d240: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
d250: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
d260: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
d270: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
d280: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
d290: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
d2a0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
d2b0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
d2c0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
d2d0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
d2e0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
d2f0: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
d300: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d310: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
d320: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
d330: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
d340: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d350: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
d360: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
d370: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
d380: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
d390: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
d3a0: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
d3b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
d3c0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
d3d0: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
d3e0: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
d3f0: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
d400: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
d410: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
d420: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
d430: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
d440: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
d450: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
d460: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
d470: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
d480: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
d490: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
d4a0: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
d4b0: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
d4c0: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d4d0: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d4e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d4f0: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d500: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d510: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d520: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d530: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d540: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d550: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d560: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d570: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d580: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d590: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d5a0: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d5b0: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d5c0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d5d0: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d5e0: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d5f0: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d600: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d610: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d620: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d630: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d640: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d650: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d660: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d670: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d680: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d690: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d6a0: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d6b0: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d6c0: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d6d0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d6e0: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d6f0: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d700: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d710: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d720: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d730: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d740: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d750: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d760: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d770: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d780: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d790: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d7a0: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d7b0: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d7c0: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d7d0: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d7e0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d7f0: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d800: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d810: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d820: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d830: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d840: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d850: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d860: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d870: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d880: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d890: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d8a0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d8b0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d8c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d8d0: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d8e0: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d8f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d900: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d910: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d920: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d930: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d940: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d950: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d960: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d970: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d980: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d990: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d9a0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d9b0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d9c0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d9d0: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d9e0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
da00: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
da10: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
da20: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
da30: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
da40: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
da50: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
da60: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
da70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
da80: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
da90: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
daa0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
dab0: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
dac0: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
dad0: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
dae0: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
daf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
db00: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
db10: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
db20: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
db30: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
db40: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
db50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
db60: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
db70: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
db80: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
db90: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
dba0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
dbb0: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
dbc0: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
dbd0: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
dbe0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
dbf0: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
dc00: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
dc10: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
dc20: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
dc30: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
dc40: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
dc50: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
dc60: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
dc70: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
dc80: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
dc90: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
dca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dcb0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
dcc0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
dcd0: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
dce0: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
dcf0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
dd00: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
dd10: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
dd20: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
dd30: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
dd40: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
dd50: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
dd60: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
dd70: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
dd80: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
dd90: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
dda0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
ddb0: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
ddc0: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
ddd0: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
dde0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
ddf0: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
de00: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
de10: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
de20: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
de30: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
de40: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
de50: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
de60: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
de70: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
de80: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
de90: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
dea0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
deb0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
dec0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
ded0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
dee0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
def0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
df00: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
df10: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
df20: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
df30: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
df40: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
df50: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
df60: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
df70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
df80: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
df90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dfa0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
dfb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dfc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
dfd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
dfe0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
dff0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
e000: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
e010: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
e020: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
e030: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
e040: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
e050: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
e060: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e070: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
e080: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
e090: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
e0a0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
e0b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
e0c0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
e0d0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
e0e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e0f0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
e100: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
e110: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
e120: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
e130: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
e140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
e150: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
e160: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
e170: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
e180: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
e190: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
e1a0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
e1b0: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
e1c0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
e1d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
e1e0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
e1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
e200: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
e210: 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 49 74 65  rse, (void*)pIte
e220: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29  m->zName, pName)
e230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e240: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
e250: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
e260: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
e270: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
e280: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
e290: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e2a0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
e2b0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
e2c0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
e2d0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
e2e0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
e2f0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
e300: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e310: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
e320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e330: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
e340: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
e350: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
e360: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
e370: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e380: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e390: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e3a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
e3b0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
e3c0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
e3d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e3e0: 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *zStart,     /*
e3f0: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73 70   Start of the sp
e400: 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  an */.  const ch
e410: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
e420: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  /* End of the sp
e430: 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  an */.){.  sqlit
e440: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e450: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
e460: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
e470: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
e480: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
e490: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
e4a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e4b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
e4c0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e4d0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
e4e0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
e4f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e500: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e510: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
e520: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61  n = sqlite3DbSpa
e530: 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c  nDup(db, zStart,
e540: 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zEnd);.  }.}../
e550: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e560: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
e570: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
e580: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
e590: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
e5a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e5b0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
e5c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e5d0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
e5e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e5f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e600: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
e610: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
e620: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
e630: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
e640: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
e650: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
e660: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e670: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
e680: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e690: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e6a0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
e6b0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e6c0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
e6d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e6e0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
e6f0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
e700: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
e710: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
e720: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
e730: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
e740: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
e750: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
e760: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
e770: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
e780: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e790: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
e7a0: 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  pr;.  struct Exp
e7b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e7c0: 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  m =  pList->a;. 
e7d0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
e7e0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b  nExpr>0 );.  do{
e7f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e800: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
e810: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
e820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e830: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
e840: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e850: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
e860: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b  n);.    pItem++;
e870: 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30  .  }while( --i>0
e880: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
e890: 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
e8a0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
e8b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
e8c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
e8d0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
e8e0: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
e8f0: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
e900: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
e910: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
e920: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
e930: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
e940: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
e950: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
e960: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
e970: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
e980: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e990: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
e9a0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
e9b0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72  List!=0 );.  for
e9c0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e9d0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e9e0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
e9f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
ea00: 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20 70  ;.     assert( p
ea10: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
ea20: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
ea30: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
ea40: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  m;.}../*.** This
ea50: 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64   is a SELECT-nod
ea60: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  e callback for t
ea70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  he expression wa
ea80: 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77  lker that.** alw
ea90: 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42 79  ays "fails".  By
eaa0: 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73 20   "fail" in this 
eab0: 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73 65  case, we mean se
eac0: 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43  t.** pWalker->eC
ead0: 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  ode to zero and 
eae0: 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abort..**.** Thi
eaf0: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75 73  s callback is us
eb00: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 65  ed by multiple e
eb10: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
eb20: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
eb30: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
eb40: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
eb50: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
eb60: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
eb70: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
eb80: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
eb90: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
eba0: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a  RC_Abort;.}../*.
ebb0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
ebc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
ebd0: 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61 6d   ID with the nam
ebe0: 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  e "true" or "fal
ebf0: 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76  se".** then conv
ec00: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20 54  ert it into an T
ec10: 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d  K_TRUEFALSE term
ec20: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
ec30: 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  ro if.** the con
ec40: 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65 64  version happened
ec50: 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74 68  , and zero if th
ec60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ec70: 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e  unaltered..*/.in
ec80: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64 54  t sqlite3ExprIdT
ec90: 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72 20  oTrueFalse(Expr 
eca0: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
ecb0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
ecc0: 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _ID || pExpr->op
ecd0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
ece0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
ecf0: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
ed00: 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a  ken, "true")==0.
ed10: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
ed20: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
ed30: 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d  oken, "false")==
ed40: 30 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72  0.  ){.    pExpr
ed50: 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46 41  ->op = TK_TRUEFA
ed60: 4c 53 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LSE;.    return 
ed70: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
ed80: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
ed90: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
eda0: 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20   a TK_TRUEFALSE 
edb0: 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75  Expr node.  Retu
edc0: 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52  rn 1 if it is TR
edd0: 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  UE.** and 0 if i
ede0: 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69  t is FALSE..*/.i
edf0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  nt sqlite3ExprTr
ee00: 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45  uthValue(const E
ee10: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
ee20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
ee30: 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29  ==TK_TRUEFALSE )
ee40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ee50: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
ee60: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65  ->u.zToken,"true
ee70: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ")==0.       || 
ee80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
ee90: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
eea0: 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20  false")==0 );.  
eeb0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e  return pExpr->u.
eec0: 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a  zToken[4]==0;.}.
eed0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
eee0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
eef0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64  r callbacks used
ef00: 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73   to check expres
ef10: 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20  sions to.** see 
ef20: 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e  if they are "con
ef30: 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20  stant" for some 
ef40: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f  definition of co
ef50: 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20  nstant.  The.** 
ef60: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
ef70: 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ue determines th
ef80: 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74  e type of "const
ef90: 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b  ant" we are look
efa0: 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a  ing.** for..**.*
efb0: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
efc0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
efd0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
efe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
eff0: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
f000: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f030: 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==1.**     sqlit
f040: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f050: 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20  NotJoin()       
f060: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f070: 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c  de==2.**     sql
f080: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
f090: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
f0a0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
f0b0: 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73  Code==3.**     s
f0c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f0d0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
f0e0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f0f0: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a  >eCode==4 or 5.*
f100: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
f110: 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  s, the callbacks
f120: 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64   set Walker.eCod
f130: 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66  e=0 and abort if
f140: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
f150: 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e  ** is found to n
f160: 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ot be a constant
f170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
f180: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f190: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73  tOrFunction() is
f1a0: 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61   used for evalua
f1b0: 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  ting expressions
f1c0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
f1d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
f1e0: 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f    The Walker.eCo
f1f0: 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68  de value is 5 wh
f200: 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e  en parsing.** an
f210: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f220: 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63   and 4 when proc
f230: 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61  essing a new sta
f240: 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64  tement.  A bound
f250: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61  .** parameter ra
f260: 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  ises an error fo
f270: 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73  r new statements
f280: 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c  , but is silentl
f290: 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  y converted.** t
f2a0: 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74  o NULL for exist
f2b0: 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ing schemas.  Th
f2c0: 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65  is allows sqlite
f2d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74  _master tables t
f2e0: 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  hat .** contain 
f2f0: 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  a bound paramete
f300: 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77  r because they w
f310: 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ere generated by
f320: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a   older versions.
f330: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20  ** of SQLite to 
f340: 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77  be parsed by new
f350: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
f360: 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61  QLite without ra
f370: 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f  ising a.** malfo
f380: 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f  rmed schema erro
f390: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f3a0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f3b0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
f3c0: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
f3d0: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
f3e0: 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20  ker->eCode is 2 
f3f0: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
f400: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f410: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
f420: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
f430: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
f440: 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71  a left join disq
f450: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
f460: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
f470: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
f480: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
f490: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
f4a0: 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48  Code==2 && ExprH
f4b0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f4c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
f4d0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
f4e0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
f4f0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f500: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
f510: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
f520: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
f530: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
f540: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
f550: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
f560: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
f570: 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b  and either pWalk
f580: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
f590: 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f  5 or the functio
f5a0: 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  n has the.    **
f5b0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
f5c0: 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20  ST flag. */.    
f5d0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
f5e0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
f5f0: 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c  ker->eCode>=4 ||
f600: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f610: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
f620: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
f630: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f640: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
f650: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
f660: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f680: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
f690: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
f6a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
f6b0: 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73   "true" or "fals
f6c0: 65 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54 20  e" in a DEFAULT 
f6d0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65 0a  clause into the.
f6e0: 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70 72        ** appropr
f6f0: 69 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  iate TK_TRUEFALS
f700: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
f710: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f720: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
f730: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
f740: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
f750: 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
f760: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
f770: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
f780: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
f790: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
f7a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
f7b0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
f7c0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f7d0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
f7e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f7f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
f800: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
f810: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f820: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
f830: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f840: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f850: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
f860: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
f870: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f880: 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 26 26 20  EP_FixedCol) && 
f890: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d  pWalker->eCode!=
f8a0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2 ){.        ret
f8b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f8c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f8d0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f8e0: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
f8f0: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
f900: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
f910: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
f930: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
f940: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
f950: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
f960: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
f970: 47 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65  GISTER:.      te
f980: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f990: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
f9a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f9b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f9c0: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
f9d0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f9e0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
f9f0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fa00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
fa10: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
fa20: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
fa30: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
fa40: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
fa50: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
fa60: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
fa70: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
fa80: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
fa90: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
faa0: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
fab0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
fac0: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
fad0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
fae0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
faf0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
fb00: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
fb10: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
fb20: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
fb30: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
fb40: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
fb50: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
fb60: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
fb70: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
fb80: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
fb90: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
fba0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
fbb0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
fbc0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
fbd0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fbe0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
fbf0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
fc00: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
fc10: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
fc20: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fc30: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
fc40: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
fc50: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
fc60: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
fc70: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fc80: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
fc90: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
fca0: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
fcb0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
fcc0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
fcd0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
fce0: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
fcf0: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
fd00: 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  g, int iCur){.  
fd10: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
fd20: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
fd30: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
fd40: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
fd50: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
fd60: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
fd70: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
fd80: 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
fd90: 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
fda0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
fdb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
fdc0: 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
fdd0: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
fde0: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
fdf0: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
fe00: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
fe10: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
fe20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
fe30: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
fe40: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
fe50: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
fe60: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
fe70: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
fe80: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
fe90: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
fea0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
feb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
fec0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
fed0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
fee0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
fef0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
ff00: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
ff10: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
ff20: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
ff30: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
ff40: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ff50: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
ff60: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
ff70: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
ff80: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
ff90: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
ffa0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ffb0: 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74  if.**.**   (1) t
ffc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ffd0: 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a   constant, and.*
ffe0: 2a 20 20 20 28 32 29 20 74 68 65 20 65 78 70 72  *   (2) the expr
fff0: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67  ession does orig
10000 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 20  inate in the ON 
10010 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
10020 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
10030 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20  FT JOIN, and.** 
10040 20 20 28 33 29 20 74 68 65 20 65 78 70 72 65 73    (3) the expres
10050 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  sion does not co
10060 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f 46 69 78  ntain any EP_Fix
10070 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a  edCol TK_COLUMN.
10080 2a 2a 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64  **       operand
10090 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
100a0 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
100b0 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ation optimizati
100c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  on..**.** When t
100d0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
100e0 72 6e 73 20 74 72 75 65 2c 20 69 74 20 69 6e 64  rns true, it ind
100f0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
10100 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61  expression.** ca
10110 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  n be added to th
10120 65 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  e pParse->pConst
10130 45 78 70 72 20 6c 69 73 74 20 61 6e 64 20 65 76  Expr list and ev
10140 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 77 68 65  aluated once whe
10150 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70 61 72 65  n.** the prepare
10160 64 20 73 74 61 74 65 6d 65 6e 74 20 73 74 61 72  d statement star
10170 74 73 20 75 70 2e 20 20 53 65 65 20 73 71 6c 69  ts up.  See sqli
10180 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
10190 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  t()..*/.int sqli
101a0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
101b0 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
101c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
101d0 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
101e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
101f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
10200 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
10210 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
10220 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
10230 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
10240 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
10250 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
10260 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
10270 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
10280 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10290 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
102a0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
102b0 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
102c0 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
102d0 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
102e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
102f0 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
10300 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
10310 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
10320 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
10330 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cur);.}.../*.** 
10340 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
10350 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
10360 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  by sqlite3ExprIs
10370 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10380 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y()..*/.static i
10390 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
103a0 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57  stantOrGroupBy(W
103b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
103c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
103d0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
103e0 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  By = pWalker->u.
103f0 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20  pGroupBy;.  int 
10400 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  i;..  /* Check i
10410 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74  f pExpr is ident
10420 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55  ical to any GROU
10430 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f  P BY term. If so
10440 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20  , consider.  ** 
10450 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f  it constant.  */
10460 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47  .  for(i=0; i<pG
10470 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
10480 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10490 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
104a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
104b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
104c0 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c  are(0, pExpr, p,
104d0 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20   -1)<2 ){.      
104e0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
104f0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
10500 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70  llSeq(pWalker->p
10510 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
10520 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69   if( sqlite3IsBi
10530 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20  nary(pColl) ){. 
10540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
10550 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
10560 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10570 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
10580 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
10590 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
105a0 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f   it variable. */
105b0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 58  .  if( pExpr->eX
105c0 3d 3d 45 58 5f 53 65 6c 65 63 74 20 29 7b 0a 20  ==EX_Select ){. 
105d0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
105e0 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
105f0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
10600 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e  ..  return exprN
10610 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57  odeIsConstant(pW
10620 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d  alker, pExpr);.}
10630 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65  ../*.** Walk the
10640 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10650 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10660 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
10670 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  eturn non-zero.*
10680 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
10690 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ion consists ent
106a0 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
106b0 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  ts or copies of 
106c0 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72  terms .** in pGr
106d0 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20  oupBy that sort 
106e0 77 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20  with the BINARY 
106f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10700 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
10710 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
10720 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
10730 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
10740 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a  ING clause can.*
10750 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e  * be promoted in
10760 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
10770 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66  use.  In order f
10780 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74  or such a promot
10790 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20  ion to work,.** 
107a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
107b0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74   HAVING clause t
107c0 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20  erm must be the 
107d0 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d  same for all mem
107e0 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72  bers of.** a "gr
107f0 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69  oup".  The requi
10800 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
10810 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75  GROUP BY term mu
10820 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20  st be BINARY.** 
10830 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20  assumes that no 
10840 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20  other collating 
10850 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61  sequence will ha
10860 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e  ve a finer-grain
10870 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74  ed.** grouping t
10880 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20  han binary.  In 
10890 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42  other words (A=B
108a0 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29   COLLATE binary)
108b0 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20   implies.** A=B 
108c0 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63  in every other c
108d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
108e0 65 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  e.  The requirem
108f0 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ent that the.** 
10900 47 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41  GROUP BY be BINA
10910 52 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74  RY is stricter t
10920 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20  han necessary.  
10930 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f  It would also wo
10940 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65  rk.** to promote
10950 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
10960 74 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d  that use the sam
10970 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  e alternative co
10980 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
10990 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50  nce as the GROUP
109a0 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68   BY term, but th
109b0 61 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65  at is much harde
109c0 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61  r to check,.** a
109d0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
109e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
109f0 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  re uncommon, and
10a00 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e   this is only an
10a10 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
10a20 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65  , so we take the
10a30 20 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e   easy way out an
10a40 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65  d simply require
10a50 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
10a60 20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41   to use the BINA
10a70 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  RY collating seq
10a80 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uence..*/.int sq
10a90 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10aa0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72  antOrGroupBy(Par
10ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
10ac0 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
10ad0 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b  GroupBy){.  Walk
10ae0 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10af0 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
10b00 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
10b10 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
10b20 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63  upBy;.  w.xSelec
10b30 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
10b40 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20   w.u.pGroupBy = 
10b50 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50  pGroupBy;.  w.pP
10b60 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
10b70 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
10b80 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
10b90 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
10ba0 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
10bb0 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
10bc0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
10bd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10be0 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
10bf0 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
10c00 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
10c10 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
10c20 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
10c30 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
10c40 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
10c50 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
10c60 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
10c70 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
10c80 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
10c90 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
10ca0 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
10cb0 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
10cc0 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10cd0 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
10ce0 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
10cf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10d00 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
10d10 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
10d20 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
10d30 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
10d40 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
10d50 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10d60 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
10d70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10d80 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
10d90 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
10da0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
10db0 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
10dc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10dd0 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
10de0 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
10df0 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
10e00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
10e10 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
10e20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
10e30 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
10e40 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
10e50 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
10e60 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
10e70 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
10e80 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  rWalkNoop;.  w.x
10e90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10ea0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
10eb0 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
10ec0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
10ed0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
10ee0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10ef0 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
10f00 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  dif.  sqlite3Wal
10f10 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10f20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
10f30 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
10f40 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10f50 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
10f60 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
10f70 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
10f80 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
10f90 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
10fa0 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
10fb0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
10fc0 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
10fd0 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
10fe0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10ff0 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
11000 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
11010 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
11020 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
11030 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
11040 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
11050 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
11060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11070 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
11080 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
11090 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
110a0 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
110b0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
110c0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  n only happen fo
110d0 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a  llowing on OOM *
110e0 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  /..  /* If an ex
110f0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
11100 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
11110 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
11120 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
11130 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
11140 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
11150 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
11160 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
11170 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
11180 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
11190 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
111a0 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
111b0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
111c0 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
111d0 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
111e0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
111f0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
11200 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
11210 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
11220 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11230 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
11240 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11250 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
11260 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
11270 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
11280 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
11290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
112a0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
112b0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
112c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
112d0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
112e0 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
112f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11300 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
11310 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
11320 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
11330 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
11340 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11350 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
11360 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
11370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
11390 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
113a0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
113b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
113c0 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
113d0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
113e0 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
113f0 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
11400 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
11410 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
11420 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
11430 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11440 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
11450 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
11460 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
11470 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
11480 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
11490 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
114a0 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
114b0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
114c0 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
114d0 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
114e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
114f0 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
11500 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
11510 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
11520 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
11530 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
11540 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
11550 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
11560 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
11570 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
11580 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
11590 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
115a0 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
115b0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
115c0 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
115d0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
115e0 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
115f0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
11600 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
11610 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
11620 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11630 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11640 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
11650 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
11660 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11670 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11680 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11690 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
116a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
116b0 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
116c0 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
116d0 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
116e0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
116f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11700 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
11710 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  :.      return E
11720 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11730 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
11740 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
11750 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f  p->pTab==0 ||  /
11760 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63  * Reference to c
11770 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f  olumn of index o
11780 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  n expression */.
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
117a0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
117b0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
117c0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
117d0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
117e0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
117f0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11800 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11810 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11820 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11830 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11840 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11850 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11860 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11870 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11880 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11890 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
118a0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
118b0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
118c0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
118d0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
118e0 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
118f0 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11900 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11910 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11920 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11930 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11940 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11950 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11960 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11970 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11980 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11990 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
119a0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
119b0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
119c0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
119d0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
119e0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
119f0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11a00 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11a10 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11a20 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11a30 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11a40 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11a50 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11a60 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11a70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11a80 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11a90 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11aa0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11ab0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11ac0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11ad0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11ae0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11af0 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11b00 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11b10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11b20 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11b30 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11b40 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11b60 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11b70 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11b80 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11ba0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11bb0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11bc0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11bd0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11be0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11bf0 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11c00 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11c10 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11c20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11c30 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11c40 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11c50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11c60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11c70 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11c80 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11c90 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11ca0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11cb0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11cc0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11cd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11ce0 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11cf0 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11d00 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11d10 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11d20 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11d30 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11d40 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11d50 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11d60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11d70 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
11d80 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
11d90 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
11da0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11db0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11dc0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11dd0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
11de0 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
11df0 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
11e00 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
11e10 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
11e20 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
11e30 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
11e40 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
11e50 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
11e60 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
11e70 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
11e80 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
11e90 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
11ea0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11eb0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
11ec0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
11ed0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
11ee0 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
11ef0 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
11f00 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
11f10 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
11f20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11f30 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 58 2d  int i;.  if( pX-
11f40 3e 65 58 21 3d 45 58 5f 53 65 6c 65 63 74 20 29  >eX!=EX_Select )
11f50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11f60 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72  /* Not a subquer
11f70 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  y */.  if( ExprH
11f80 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11f90 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
11fa0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
11fd0 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20  elated subq */. 
11fe0 20 7d 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70   }.  p = pX->x.p
11ff0 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d  Select;.  if( p-
12000 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
12010 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12020 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75   /* Not a compou
12030 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  nd SELECT */.  i
12040 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
12050 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
12060 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
12070 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
12080 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12090 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
120a0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
120b0 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74  inct );.    test
120c0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
120d0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
120e0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
120f0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
12100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
12110 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b  /* No DISTINCT k
12120 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67  eyword and no ag
12130 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
12140 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
12150 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
12160 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
12170 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55    /* Has no GROU
12180 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
12190 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
121a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
121b0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
121c0 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
121d0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
121e0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
121f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12200 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
12210 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
12220 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
12230 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
12240 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
12250 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12260 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
12270 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
12280 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
12290 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
122a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
122b0 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
122c0 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
122d0 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
122e0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
122f0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
12300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
12310 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
12320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12330 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
12340 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
12350 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12360 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
12370 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12380 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
12390 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
123a0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
123b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
123c0 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c  t!=0 );.  /* All
123d0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
123e0 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e  must be columns.
123f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12400 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
12410 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
12420 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRes = pEList->a
12430 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
12440 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f  f( pRes->op!=TK_
12450 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
12460 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
12470 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  Res->iTable==pSr
12480 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  c->a[0].iCursor 
12490 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72  );  /* Not a cor
124a0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
124b0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
124c0 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   p;.}.#endif /* 
124d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
124e0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
124f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12500 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
12510 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
12520 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d  hecks the left-m
12530 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  ost column of in
12540 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74  dex table iCur t
12550 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63  o see if.** it c
12560 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
12570 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65   entries.  Cause
12580 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74   the register at
12590 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62   regHasNull to b
125a0 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  e set.** to a no
125b0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
125c0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  iCur contains no
125d0 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72   NULLs.  Cause r
125e0 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75  egister regHasNu
125f0 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20  ll.** to be set 
12600 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20  to NULL if iCur 
12610 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12620 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
12630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12640 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
12650 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20  llFlag(Vdbe *v, 
12660 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65  int iCur, int re
12670 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74  gHasNull){.  int
12680 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65   addr1;.  sqlite
12690 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
126a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
126b0 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  gHasNull);.  add
126c0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
126d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
126e0 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
126f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
12700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12710 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
12720 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
12730 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
12740 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
12750 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
12760 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
12770 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
12780 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
12790 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
127a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
127b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
127c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
127d0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
127e0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
127f0 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
12800 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20  ith a list (not 
12810 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74  a subquery) on t
12820 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
12830 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20  d side.  Return 
12840 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73  TRUE if that lis
12850 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  t is constant..*
12860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
12870 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
12880 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a  ant(Expr *pIn){.
12890 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20    Expr *pLHS;.  
128a0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
128b0 74 28 20 70 49 6e 2d 3e 65 58 21 3d 45 58 5f 53  t( pIn->eX!=EX_S
128c0 65 6c 65 63 74 20 29 3b 0a 20 20 70 4c 48 53 20  elect );.  pLHS 
128d0 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
128e0 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
128f0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
12900 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
12910 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
12920 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
12930 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
12940 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12950 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
12960 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
12970 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
12980 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
12990 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
129a0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
129b0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
129c0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
129d0 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
129e0 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
129f0 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
12a00 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
12a10 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
12a20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12a30 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
12a40 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
12a50 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
12a60 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
12a70 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
12a80 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
12a90 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
12aa0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
12ab0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
12ac0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
12ad0 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
12ae0 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
12af0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
12b00 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12b10 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
12b20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
12b30 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
12b40 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
12b50 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
12b60 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
12b70 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
12b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12b90 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
12ba0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
12bb0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
12bc0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
12bd0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12be0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
12bf0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
12c00 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12c10 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
12c20 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12c30 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
12c40 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
12c50 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
12c60 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
12c70 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
12c80 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
12c90 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
12ca0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
12cb0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12cc0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
12cd0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
12d00 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
12d10 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
12d20 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
12d30 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
12d40 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
12d50 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
12d80 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
12d90 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
12da0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
12db0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
12dc0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
12dd0 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
12de0 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
12df0 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
12e00 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
12e10 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
12e20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
12e30 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
12e40 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
12e50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
12e60 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
12e70 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
12e80 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
12e90 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
12ea0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
12eb0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
12ec0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
12ed0 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
12ee0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
12ef0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
12f00 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
12f10 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
12f20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
12f30 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
12f40 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74  must contain, at
12f50 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20   a minimum, one 
12f60 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
12f70 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
12f80 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
12f90 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  OOP but not both
12fa0 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
12fb0 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
12fc0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
12fd0 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
12fe0 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
12ff0 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a  used for a fast.
13000 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  ** membership te
13010 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
13020 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
13030 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69  is set, the IN i
13040 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ndex will.** be 
13050 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
13060 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
13070 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13080 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
13090 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
130a0 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
130b0 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
130c0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
130d0 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
130e0 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
130f0 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
13100 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
13110 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
13120 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
13130 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61  ble will be crea
13140 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  ted unless the s
13150 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
13160 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
13170 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
13180 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
13190 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
131a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
131b0 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
131c0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
131d0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
131e0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
131f0 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
13200 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
13210 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
13220 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
13230 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
13240 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
13250 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
13260 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
13270 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
13280 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
13290 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
132a0 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
132b0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
132c0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
132d0 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
132e0 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
132f0 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
13300 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
13310 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
13320 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
13330 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
13340 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13350 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
13360 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
13370 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
13380 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
13390 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
133a0 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
133b0 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
133c0 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
133d0 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
133e0 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
133f0 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
13400 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
13410 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
13420 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
13430 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
13440 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
13450 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
13460 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13470 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
13480 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
13490 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
134a0 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
134b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
134c0 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
134d0 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
134e0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
134f0 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
13500 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
13510 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
13520 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
13530 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
13540 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
13550 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
13560 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
13570 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
13580 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
13590 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
135a0 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
135b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
135c0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
135d0 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
135e0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
135f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
13600 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
13610 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
13620 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
13630 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
13640 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
13650 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
13660 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
13670 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
13680 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
13690 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
136a0 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
136b0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
136c0 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
136d0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
136e0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
136f0 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
13700 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
13710 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
13720 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
13730 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
13740 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
13750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
13760 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
13770 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
13780 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
13790 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
137a0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
137b0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
137c0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
137d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
137e0 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
137f0 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
13800 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
13810 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
13820 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13830 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
13840 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
13850 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
13860 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
13870 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
13880 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
13890 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
138a0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
138b0 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
138c0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
138d0 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
138e0 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
138f0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13900 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
13910 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
13920 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
13930 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
13940 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
13950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13960 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
13970 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
13980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
139a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
139b0 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139d0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
139e0 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
139f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13a00 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
13a30 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
13a40 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
13a50 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
13a60 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
13a70 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
13a80 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
13a90 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
13aa0 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20   *aiMap         
13ab0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
13ac0 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
13ad0 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
13ae0 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ds */.){.  Selec
13af0 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
13b20 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
13b30 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
13b40 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b60 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
13b70 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
13b80 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
13b90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13ba0 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
13bb0 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
13bc0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
13bd0 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
13c00 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
13c10 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
13c20 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13c30 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
13c40 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
13c50 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
13c60 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
13c70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
13c80 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
13c90 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
13ca0 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
13cb0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
13cc0 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
13cd0 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
13ce0 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
13cf0 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
13d00 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
13d10 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
13d20 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
13d30 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
13d40 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
13d50 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
13d60 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
13d70 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
13d80 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
13d90 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
13da0 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
13db0 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
13dc0 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
13dd0 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
13de0 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
13df0 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
13e00 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
13e10 48 61 73 4e 75 6c 6c 20 26 26 20 70 58 2d 3e 65  HasNull && pX->e
13e20 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 29 7b 0a  X==EX_Select ){.
13e30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45      int i;.    E
13e40 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13e50 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  = pX->x.pSelect-
13e60 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
13e70 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13e80 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13e90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13ea0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69  prCanBeNull(pELi
13eb0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
13ec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13ed0 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74     if( i==pEList
13ee0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
13ef0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20   prRhsHasNull = 
13f00 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
13f10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
13f20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  if an existing t
13f30 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61  able or index ca
13f40 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  n be used to.  *
13f50 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75  * satisfy the qu
13f60 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72  ery.  This is pr
13f70 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65  eferable to gene
13f80 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20  rating a new .  
13f90 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  ** ephemeral tab
13fa0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  le.  */.  if( pP
13fb0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
13fc0 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74   (p = isCandidat
13fd0 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d  eForInOpt(pX))!=
13fe0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13ff0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14000 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
14010 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14020 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ection */.    Ta
14030 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74       /* Table <t
14060 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31  able>. */.    i1
14070 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  6 iDb;          
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
140a0 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f   idx for pTab */
140b0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
140c0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
140d0 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  t;.    int nExpr
140e0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
140f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
14100 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
14110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
14120 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
14130 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
14140 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
14150 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
14160 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
14170 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
14180 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
14190 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
141a0 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
141b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
141c0 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
141d0 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
141e0 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
141f0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
14200 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61  ;..    /* Code a
14210 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  n OP_Transaction
14220 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63   and OP_TableLoc
14230 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a  k for <table>. *
14240 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
14250 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14260 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
14270 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
14280 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
14290 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
142a0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
142b0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
142c0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
142d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
142e0 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f     assert(v);  /
142f0 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
14300 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65  () has always be
14310 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  en previously ca
14320 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  lled */.    if( 
14330 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
14340 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
14350 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
14360 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20     /* The "x IN 
14370 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  (SELECT rowid FR
14380 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20  OM table)" case 
14390 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  */.      int iAd
143a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
143b0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
143c0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
143d0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
143e0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
143f0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
14400 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
14410 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
14420 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14430 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 45 78  _ROWID;.      Ex
14440 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
14450 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
14460 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 52 4f         "USING RO
14470 57 49 44 20 53 45 41 52 43 48 20 4f 4e 20 54 41  WID SEARCH ON TA
14480 42 4c 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  BLE %s FOR IN-OP
14490 45 52 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e  ERATOR",pTab->zN
144a0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
144b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
144c0 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
144d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
144e0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
14510 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
14520 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
14530 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
14540 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
14550 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
14560 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
14570 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
14580 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20   each .      ** 
14590 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
145a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
145b0 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63  finity of each c
145c0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20  olumn in table. 
145d0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52       ** on the R
145e0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
145f0 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f  rator.  If it no
14600 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
14610 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  sible to.      *
14620 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20  * use any index 
14630 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
14640 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
14650 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
14660 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
14670 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
14680 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
14690 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
146a0 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
146b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
146c0 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  l = pEList->a[i]
146d0 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  .pExpr->iColumn;
146e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
146f0 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61  xaff = sqlite3Ta
14700 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
14710 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a  y(pTab,iCol); /*
14720 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
14730 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66        char cmpaf
14740 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
14750 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c  reAffinity(pLhs,
14760 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20   idxaff);.      
14770 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61    testcase( cmpa
14780 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
14790 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74  LOB );.        t
147a0 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
147b0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
147c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74   );.        swit
147d0 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20  ch( cmpaff ){.  
147e0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
147f0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20  ITE_AFF_BLOB:.  
14800 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14810 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
14820 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
14830 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14840 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
14850 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65  finity() only re
14860 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e  turns TEXT if on
14870 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
14880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
14890 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69  er has no affini
148a0 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ty and the other
148b0 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20   side is TEXT.  
148c0 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20  Hence,.         
148d0 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77     ** the only w
148e0 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f  ay for cmpaff to
148f0 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20   be TEXT is for 
14900 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58  idxaff to be TEX
14910 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  T.            **
14920 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72   and for the ter
14930 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  m on the LHS of 
14940 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e  the IN to have n
14950 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  o affinity. */. 
14960 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
14970 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54  t( idxaff==SQLIT
14980 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14990 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
149a0 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
149b0 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
149c0 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
149d0 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
149e0 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a  finity(idxaff);.
149f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14a00 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  }..      if( aff
14a10 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20  inity_ok ){.    
14a20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
14a30 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  r an existing in
14a40 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f  dex that will wo
14a50 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rk for this IN o
14a60 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
14a70 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14a80 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
14a90 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78  & eType==0; pIdx
14aa0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14ab0 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
14ac0 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f   colUsed;      /
14ad0 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * Columns of the
14ae0 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20   index used */. 
14af0 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
14b00 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f   mCol;         /
14b10 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63  * Mask for the c
14b20 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f  urrent column */
14b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14b40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78  Idx->nColumn<nEx
14b50 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pr ) continue;. 
14b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
14b70 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42  mum nColumn is B
14b80 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c  MS-2, not BMS-1,
14b90 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
14ba0 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20  compute.        
14bb0 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78    ** BITMASK(nEx
14bc0 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72  pr) without over
14bd0 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20  flowing */.     
14be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14bf0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
14c00 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-2 );.         
14c10 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
14c20 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20  >nColumn==BMS-1 
14c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14c40 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
14c50 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65  BMS-1 ) continue
14c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14c70 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a  mustBeUnique ){.
14c80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14c90 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
14ca0 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
14cb0 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   ||(pIdx->nColum
14cc0 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e  n>nExpr && !IsUn
14cd0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
14ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
14d00 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73  ntinue;  /* This
14d10 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e   index is not un
14d20 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e  ique over the IN
14d30 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   RHS columns */.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14d50 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
14d60 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d         colUsed =
14d70 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73   0;   /* Columns
14d80 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73   of index used s
14d90 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
14da0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
14db0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14dc0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
14dd0 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
14de0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
14df0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
14e00 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
14e10 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Rhs = pEList->a[
14e20 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14e30 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14e40 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
14e50 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14e60 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
14e70 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20  pRhs);.         
14e80 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20     int j;.  .   
14e90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14ea0 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73   pReq!=0 || pRhs
14eb0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ->iColumn==XN_RO
14ec0 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  WID || pParse->n
14ed0 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
14ee0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
14ef0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
14f00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
14f10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
14f20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  pRhs->iColumn ) 
14f30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14f50 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
14f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14f70 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20   if( pReq!=0 && 
14f80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
14f90 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  Req->zName, pIdx
14fa0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
14fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14fc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14fd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14fe0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
15000 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15010 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b  j==nExpr ) break
15020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ;.            mC
15030 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b  ol = MASKBIT(j);
15040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15050 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20   mCol & colUsed 
15060 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68  ) break; /* Each
15070 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c   column used onl
15080 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20  y once */.      
15090 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d        colUsed |=
150a0 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   mCol;.         
150b0 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61     if( aiMap ) a
150c0 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  iMap[i] = j;.   
150d0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
150e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
150f0 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65  =nExpr || colUse
15100 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70  d!=(MASKBIT(nExp
15110 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r)-1) );.       
15120 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d     if( colUsed==
15130 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
15140 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
15150 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
15160 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
15170 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65  t means the inde
15180 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65  x pIdx is usable
15190 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
151a0 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
151b0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
151c0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
151d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
151e0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
151f0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15200 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20     "USING INDEX 
15230 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54  %s FOR IN-OPERAT
15240 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  OR",pIdx->zName)
15250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
15260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15270 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
15280 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
15290 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
152b0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
152c0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
152d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
152e0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
152f0 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
15300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
15310 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
15320 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
15330 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
15340 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70              eTyp
15350 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
15360 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61  EX_ASC + pIdx->a
15370 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20  SortOrder[0];.  
15380 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15390 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
153a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
153b0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
153c0 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20  D_MASK.         
153d0 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20       i64 mask = 
153e0 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20  (1<<nExpr)-1;.  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15400 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
15410 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
15420 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  sed, .          
15430 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c          iTab, 0,
15440 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20   0, (u8*)&mask, 
15450 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
15460 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f.              
15470 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
15480 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
154a0 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ( nExpr==1 ){.  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
154c0 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
154d0 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
154e0 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
154f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15520 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
15530 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
15540 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45  }.        } /* E
15550 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64  nd loop over ind
15560 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20  exes */.      } 
15570 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e  /* End if( affin
15580 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20  ity_ok ) */.    
15590 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20  } /* End if not 
155a0 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a  an rowid index *
155b0 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74  /.  } /* End att
155c0 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65  empt to optimize
155d0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
155e0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70  */..  /* If no p
155f0 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  reexisting index
15600 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
15610 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a  r the IN clause.
15620 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45    ** and IN_INDE
15630 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c  X_NOOP is an all
15640 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20  owed reply.  ** 
15650 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74  and the RHS of t
15660 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
15670 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20  s a list, not a 
15680 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e  subquery.  ** an
15690 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74  d the RHS is not
156a0 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73   constant or has
156b0 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65   two or fewer te
156c0 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69  rms,.  ** then i
156d0 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63  t is not worth c
156e0 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
156f0 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76  eral table to ev
15700 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  aluate.  ** the 
15710 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72  IN operator so r
15720 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
15730 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OOP..  */.  if( 
15740 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28  eType==0.   && (
15750 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
15760 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 21 3d 30 0a 20  EX_NOOP_OK)!=0. 
15770 20 20 26 26 20 70 58 2d 3e 65 58 3d 3d 45 58 5f    && pX->eX==EX_
15780 4c 69 73 74 0a 20 20 20 26 26 20 28 21 73 71 6c  List.   && (!sql
15790 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
157a0 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78  ant(pX) || pX->x
157b0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32  .pList->nExpr<=2
157c0 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65  ).  ){.    eType
157d0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   = IN_INDEX_NOOP
157e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  ;.  }..  if( eTy
157f0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
15800 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
15810 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
15820 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
15830 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
15840 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
15850 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
15860 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
15870 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
15880 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
15890 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
158a0 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
158b0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
158c0 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
158d0 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
158e0 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
158f0 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
15900 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
15910 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
15920 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
15930 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
15940 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
15950 26 20 70 58 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73  & pX->eX==EX_Lis
15960 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  t ){.        eTy
15970 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
15980 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
15990 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
159a0 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
159b0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
159c0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
159d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
159e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
159f0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
15a00 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
15a10 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
15a20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
15a30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
15a40 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
15a50 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
15a60 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
15a70 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a  le = iTab;.  }..
15a80 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
15a90 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15aa0 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
15ab0 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
15ac0 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
15ad0 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
15ae0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15af0 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
15b00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15b10 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
15b20 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = i;.  }.  ret
15b30 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
15b40 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
15b50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15b60 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
15b70 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
15b80 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
15b90 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
15ba0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
15bb0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
15bc0 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
15bd0 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
15be0 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
15bf0 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
15c00 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
15c10 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
15c20 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
15c30 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
15c40 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
15c50 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
15c60 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
15c70 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
15c80 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
15c90 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
15ca0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
15cb0 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
15cc0 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
15cd0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
15ce0 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
15cf0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
15d00 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
15d10 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15d20 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
15d30 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
15d40 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c  Expr->eX==EX_Sel
15d50 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
15d60 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
15d70 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
15d80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
15d90 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
15da0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15db0 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
15dc0 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
15dd0 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
15de0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15df0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
15e00 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
15e10 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15e20 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
15e30 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
15e40 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
15e50 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
15e60 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
15e70 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
15e80 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
15e90 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
15ea0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
15eb0 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
15ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15ed0 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
15ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15ef0 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
15f00 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
15f10 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
15f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15f30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
15f40 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
15f50 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
15f60 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
15f70 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
15f80 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
15f90 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
15fa0 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
15fb0 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
15fc0 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
15fd0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
15fe0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
15ff0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16000 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
16010 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
16020 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
16030 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
16040 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
16050 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
16060 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16070 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
16080 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
16090 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
160a0 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
160b0 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
160c0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
160d0 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
160e0 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
160f0 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
16100 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
16110 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
16120 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
16130 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
16140 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
16150 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
16160 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
16170 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
16180 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
16190 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
161a0 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
161b0 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
161c0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
161d0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
161e0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
161f0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
16200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16210 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
16220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16230 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
16240 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65  pExpr->eX==EX_Se
16250 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
16260 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
16270 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  r(pParse, pExpr-
16280 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
16290 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20  st->nExpr, 1);. 
162a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
162b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
162c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
162d0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
162e0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
162f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
16300 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
16310 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
16320 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
16330 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
16340 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
16350 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
16360 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
16370 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
16380 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
16390 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
163a0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
163b0 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
163c0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
163d0 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
163e0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
163f0 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
16400 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
16410 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
16420 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
16430 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
16440 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
16450 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
16460 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
16470 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
16480 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
16490 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
164a0 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
164b0 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
164c0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
164d0 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
164e0 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
164f0 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
16500 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
16510 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
16520 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
16530 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
16540 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
16550 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
16560 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
16570 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
16580 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
16590 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
165a0 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
165b0 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
165c0 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
165d0 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
165e0 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
165f0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
16600 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
16610 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
16620 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
16630 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
16640 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
16650 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
16660 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
16670 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
16680 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
16690 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
166a0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
166b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
166c0 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
166d0 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
166e0 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
166f0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
16700 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
16710 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
16720 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
16730 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
16740 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
16750 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
16760 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
16770 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
16780 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
16790 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
167a0 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
167b0 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53  a multi-column S
167c0 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c  ELECT, the resul
167d0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
167e0 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61   contiguous.** a
167f0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
16800 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  s and the return
16810 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65   value is the re
16820 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65  gister of the le
16830 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c  ft-most.** resul
16840 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72  t column.  Retur
16850 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61  n 0 for IN opera
16860 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
16870 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23  ror occurs..*/.#
16880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16890 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
168a0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
168b0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
168c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
168d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
168e0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
168f0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
16900 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
16910 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
16920 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
16930 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
16940 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
16950 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
16960 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
16970 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
16980 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
16990 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
169a0 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
169b0 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
169c0 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
169d0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
16a00 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
16a10 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
16a40 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
16a50 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
16a60 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
16a70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16a80 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
16a90 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
16aa0 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
16ab0 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53  of the IN/EXISTS
16ac0 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
16ad0 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
16ae0 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
16af0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
16b00 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
16b10 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
16b20 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
16b30 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
16b40 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
16b50 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
16b60 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
16b70 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
16b80 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
16b90 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
16ba0 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
16bb0 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
16bc0 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
16bd0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
16be0 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
16bf0 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
16c00 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
16c10 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
16c20 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
16c30 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
16c40 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
16c50 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
16c60 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
16c70 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16c80 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
16c90 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61  ){.    jmpIfDyna
16ca0 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mic = sqlite3Vdb
16cb0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
16cc0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
16cd0 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  e(v);.  }..  swi
16ce0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
16cf0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
16d00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
16d10 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
16d20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16d30 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
16d40 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
16d50 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
16d60 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16d70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
16d80 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16d90 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
16da0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
16db0 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
16dc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
16dd0 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20       int nVal;  
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
16e00 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20  or pLeft */.    
16e10 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20    .      nVal = 
16e20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16e30 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
16e40 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
16e50 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20  owid || nVal==1 
16e60 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
16e70 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
16e80 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
16e90 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
16ea0 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
16eb0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
16ec0 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
16ed0 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
16ee0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
16ef0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
16f00 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65  ed with index ke
16f10 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
16f20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
16f30 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
16f40 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
16f50 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
16f60 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
16f70 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
16f80 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
16f90 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
16fa0 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
16fb0 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
16fc0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16fd0 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
16fe0 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
16ff0 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
17000 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
17010 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
17020 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
17030 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
17040 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
17050 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
17060 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
17070 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
17080 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
17090 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
170a0 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
170b0 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
170c0 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
170d0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
170e0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
170f0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
17100 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
17110 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
17120 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
17130 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
17140 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
17150 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17170 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
17180 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17190 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64  iTable, (isRowid
171a0 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20  ?0:nVal));.     
171b0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
171c0 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
171d0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
171e0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20  arse->db, nVal, 
171f0 31 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  1);..      asser
17200 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
17210 5f 53 65 6c 65 63 74 20 7c 7c 20 70 45 78 70 72  _Select || pExpr
17220 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b  ->eX==EX_List );
17230 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
17240 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20  ->eX==EX_Select 
17250 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
17260 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
17270 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
17280 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
17290 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
172a0 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
172b0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
172c0 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
172d0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
172e0 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
172f0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
17300 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
17310 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
17320 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
17330 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
17340 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
17350 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
17360 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  >pEList;..      
17370 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
17380 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
17390 25 73 4c 49 53 54 20 53 55 42 51 55 45 52 59 22  %sLIST SUBQUERY"
173a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ,.            jm
173b0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
173c0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 0a 20  :"CORRELATED ". 
173d0 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
173e0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
173f0 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  wid );.        /
17400 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
17410 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
17420 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
17430 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20  atch, that.     
17440 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c     ** error will
17450 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68   have been caugh
17460 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65  t long before we
17470 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
17480 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  t. */.        if
17490 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d  ( ALWAYS(pEList-
174a0 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b  >nExpr==nVal) ){
174b0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
174c0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
174d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
174e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
174f0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
17500 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
17510 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
17520 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
17530 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
17540 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
17550 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
17560 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
17570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
17580 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
17590 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
175a0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
175b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
175c0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
175d0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
175e0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
175f0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
17600 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17610 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17620 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
17630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17640 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17650 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17660 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
17670 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
17680 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
17690 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
176a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
176b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
176c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
176d0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
176e0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
176f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
17700 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
17710 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
17720 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
17730 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
17740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
17750 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
17760 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17770 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
17780 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17790 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
177a0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
177b0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
177c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
177d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
177e0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
177f0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
17800 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
17810 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
17820 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
17830 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
17840 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
17850 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
17860 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
17870 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
17880 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
17890 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
178a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
178b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
178c0 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
178d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
178e0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
178f0 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
17900 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
17910 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
17920 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
17930 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
17940 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
17950 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
17960 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
17970 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
17980 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
17990 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
179a0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
179b0 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
179c0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
179d0 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
179e0 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
179f0 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
17a00 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
17a10 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
17a20 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
17a30 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
17a40 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
17a50 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
17a60 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
17a70 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
17a80 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
17a90 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
17aa0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
17ab0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17ac0 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
17ad0 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
17ae0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
17af0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
17b00 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ty(pLeft);.     
17b10 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
17b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
17b30 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
17b40 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
17b50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17b60 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
17b80 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
17b90 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
17ba0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
17bb0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
17bc0 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
17bd0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
17be0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
17bf0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
17c00 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17c10 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17c20 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
17c30 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
17c40 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17c50 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17c60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
17c70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17c90 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
17ca0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17cb0 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30 2c  _Blob, 0, r2, 0,
17cc0 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b   "", P4_STATIC);
17cd0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
17ce0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
17cf0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
17d00 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
17d10 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17d20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
17d30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
17d40 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
17d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17d60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17d70 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
17d80 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
17d90 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
17da0 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
17db0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
17dc0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
17dd0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
17de0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
17df0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
17e00 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
17e10 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
17e20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
17e30 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17e40 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17e50 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17e60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17e70 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
17e80 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
17e90 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
17ea0 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
17eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17ec0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
17ed0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
17ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
17ef0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
17f00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
17f10 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
17f20 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
17f30 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
17f40 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
17f50 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
17f60 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
17f70 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
17f80 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
17f90 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
17fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17fb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
17fc0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
17fd0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
17fe0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
17ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18000 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
18010 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
18020 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
18030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
18040 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
18050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18060 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18070 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
18080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
180b0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
180d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
180f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18100 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
18110 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
18120 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
18130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18150 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
18160 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
18170 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
18180 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
18190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
181a0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
181b0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
181c0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31  Table, r2, r3, 1
181d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
181e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
181f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
18200 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18210 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
18220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18230 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18240 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
18250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18260 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
18270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18280 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
18290 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f  (void *)pKeyInfo
182a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
182b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
182c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
182d0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
182e0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
182f0 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  T:.    default: 
18300 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
18310 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e  3:    (SELECT ..
18320 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
18330 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20    **     or:    
18340 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e  EXISTS(SELECT ..
18350 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20  . FROM ...).    
18360 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
18370 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65  r a SELECT, gene
18380 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
18390 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
183a0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  all columns of. 
183b0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
183c0 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72  t row into an ar
183d0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
183e0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
183f0 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a  index of.      *
18400 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
18410 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ster..      **. 
18420 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
18430 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
18440 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30  ite an integer 0
18450 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
18460 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20   1 (exists).    
18470 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69    ** into a regi
18480 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ster and return 
18490 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
184a0 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mber..      **. 
184b0 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20       ** In both 
184c0 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79  cases, the query
184d0 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69   is augmented wi
184e0 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41  th "LIMIT 1".  A
184f0 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  ny .      ** pre
18500 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69  existing limit i
18510 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70  s discarded in p
18520 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20  lace of the new 
18530 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a  LIMIT 1..      *
18540 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
18550 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18570 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18580 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
18590 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
185a0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
185b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
185c0 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
185d0 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
185e0 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20        int nReg; 
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18610 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
18620 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 45 78  cate */.      Ex
18630 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20  pr *pLimit;     
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74      /* New limit
18660 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a   expression */..
18670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18680 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18690 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
186a0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
186b0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
186c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
186d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
186e0 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
186f0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
18700 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
18710 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74  r->eX==EX_Select
18720 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20   );..      pSel 
18730 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
18740 63 74 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69  ct;.      Explai
18750 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
18760 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c 41 52  se, 1, "%sSCALAR
18770 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20   SUBQUERY",.    
18780 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
18790 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
187a0 45 4c 41 54 45 44 20 22 29 29 3b 0a 20 20 20 20  ELATED "));.    
187b0 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e    nReg = pExpr->
187c0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20  op==TK_SELECT ? 
187d0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSel->pEList->nE
187e0 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73  xpr : 1;.      s
187f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
18800 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70  Init(&dest, 0, p
18810 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a  Parse->nMem+1);.
18820 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
18830 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  em += nReg;.    
18840 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
18850 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
18860 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
18870 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
18880 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
18890 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
188a0 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73         dest.nSds
188b0 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20  t = nReg;.      
188c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
188d0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
188e0 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  0, dest.iSDParm,
188f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52   dest.iSDParm+nR
18900 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  eg-1);.        V
18910 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18920 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
18930 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
18940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
18950 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
18960 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
18970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18980 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18990 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
189a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
189b0 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
189c0 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
189d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
189e0 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
189f0 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
18a00 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  ->db, TK_INTEGER
18a10 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65  ,&sqlite3IntToke
18a20 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ns[1], 0);.     
18a30 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69   if( pSel->pLimi
18a40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18a50 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
18a60 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
18a70 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b  >pLimit->pLeft);
18a80 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  .        pSel->p
18a90 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70  Limit->pLeft = p
18aa0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Limit;.      }el
18ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  se{.        pSel
18ac0 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
18ad0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
18ae0 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74  TK_LIMIT, pLimit
18af0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
18b00 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74      pSel->iLimit
18b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
18b20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
18b30 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
18b40 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
18b50 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
18b60 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
18b70 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
18b80 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
18b90 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
18ba0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62  Reduce);.      b
18bb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
18bc0 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46  .  if( rHasNullF
18bd0 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
18be0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
18bf0 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  (v, pExpr->iTabl
18c00 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29  e, rHasNullFlag)
18c10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70  ;.  }..  if( jmp
18c20 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a  IfDynamic>=0 ){.
18c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
18c40 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66  umpHere(v, jmpIf
18c50 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 0a 20  Dynamic);.  }.. 
18c60 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
18c70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18c80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
18c90 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
18ca0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
18cb0 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
18cc0 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
18cd0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
18ce0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
18cf0 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
18d00 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
18d10 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
18d20 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
18d30 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
18d40 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
18d50 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
18d60 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
18d70 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
18d80 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
18d90 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
18da0 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
18db0 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
18dc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
18dd0 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
18de0 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
18df0 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
18e00 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
18e10 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
18e20 3b 0a 20 20 69 66 28 20 70 49 6e 2d 3e 65 58 3d  ;.  if( pIn->eX=
18e30 3d 45 58 5f 53 65 6c 65 63 74 20 29 7b 0a 20 20  =EX_Select ){.  
18e40 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70    if( nVector!=p
18e50 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
18e60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
18e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
18e80 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
18e90 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  se, pIn->x.pSele
18ea0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
18eb0 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  r, nVector);.   
18ec0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18ed0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
18ee0 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20  Vector!=1 ){.   
18ef0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
18f00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
18f10 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  In->pLeft);.    
18f20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
18f30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
18f40 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
18f50 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18f60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18f70 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
18f80 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
18f90 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
18fa0 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
18fb0 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
18fc0 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
18fd0 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
18fe0 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
18ff0 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78  lar or vector ex
19000 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a  pression.  The .
19010 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
19020 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61  de (RHS) is an a
19030 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
19040 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75  more scalar valu
19050 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71  es, or a.** subq
19060 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48  uery.  If the RH
19070 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  S is a subquery,
19080 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
19090 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75  esult columns mu
190a0 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20  st.** match the 
190b0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
190c0 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  s in the vector 
190d0 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20  on the LHS.  If 
190e0 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20  the RHS is.** a 
190f0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20  list of values, 
19100 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
19110 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a  a scalar. .**.**
19120 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
19130 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
19140 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e  LHS value is con
19150 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
19160 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65  e RHS..** The re
19170 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66  sult is false if
19180 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69   the LHS is defi
19190 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68  nitely not in th
191a0 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20  e RHS.  The .** 
191b0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69  result is NULL i
191c0 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  f the presence o
191d0 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65  f the LHS in the
191e0 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a   RHS cannot be .
191f0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75  ** determined du
19200 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a  e to NULLs..**.*
19210 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
19220 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
19230 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74  at jumps to dest
19240 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
19250 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
19260 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
19270 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
19280 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
19290 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
192a0 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
192b0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
192c0 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
192d0 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
192e0 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
192f0 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
19300 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
19310 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20   through..**.** 
19320 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65  See the separate
19330 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
19340 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
19350 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69  le in the canoni
19360 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f  cal.** SQLite so
19370 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64  urce tree for ad
19380 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19390 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
193a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
193b0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
193c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
193d0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
193e0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
193f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
19400 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
19410 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
19420 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
19430 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
19440 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19450 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
19460 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
19470 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
19480 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
19490 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
194a0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
194b0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
194c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
194d0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
194e0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
194f0 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
19500 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
19510 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
19520 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
19530 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
19540 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  HS */.  int rLhs
19550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19560 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c   Register(s) hol
19570 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c  ding the LHS val
19580 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  ues */.  int rLh
19590 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f  sOrig;         /
195a0 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69  * LHS values pri
195b0 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67  or to reordering
195c0 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20   by aiMap[] */. 
195d0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
195e0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
195f0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
19600 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
19610 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  *aiMap = 0;     
19620 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65    /* Map from ve
19630 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e  ctor field to in
19640 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  dex column */.  
19650 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20  char *zAff = 0; 
19660 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
19670 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d  y string for com
19680 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e  parisons */.  in
19690 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20  t nVector;      
196a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
196b0 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20  ectors for this 
196c0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
196d0 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20   int iDummy;    
196e0 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20         /* Dummy 
196f0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70  parameter to exp
19700 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f  rCodeVector() */
19710 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20  .  Expr *pLeft; 
19720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19730 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
19740 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
19750 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
19760 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65    /* loop counte
19770 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  r */.  int destS
19780 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20  tep2;        /* 
19790 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68  Where to jump wh
197a0 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e  en NULLs seen in
197b0 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74   step 2 */.  int
197c0 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20   destStep6 = 0; 
197d0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
197e0 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a  ode for Step 6 *
197f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74  /.  int addrTrut
19800 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  hOp;      /* Add
19810 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74  ress of opcode t
19820 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74  hat determines t
19830 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f  he IN is true */
19840 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75  .  int destNotNu
19850 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ll;      /* Jump
19860 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61   here if a compa
19870 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75  rison is not tru
19880 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20  e in step 6 */. 
19890 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
198a0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
198b0 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70   the step-6 loop
198c0 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20   */ ..  pLeft = 
198d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
198e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
198f0 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
19900 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
19910 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
19920 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
19930 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f  pExpr);.  nVecto
19940 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
19950 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
19960 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
19970 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
19980 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
19990 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
199a0 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
199b0 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
199c0 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
199d0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
199e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
199f0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
19a00 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b  odeIN_oom_error;
19a10 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
19a20 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48  o compute the RH
19a30 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74  S. After this st
19a40 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ep, if anything 
19a50 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  other than.  ** 
19a60 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
19a70 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74   returned, the t
19a80 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20  able opened ith 
19a90 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54  cursor pExpr->iT
19aa0 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  able .  ** conta
19ab0 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
19ac0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
19ad0 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58  RHS. If IN_INDEX
19ae0 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
19af0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20  d,.  ** the RHS 
19b00 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
19b10 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20   coded.  */.  v 
19b20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19b30 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
19b40 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
19b50 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
19b60 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
19b70 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19b80 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
19b90 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
19ba0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
19bb0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
19bc0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
19bf0 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
19c00 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
19c30 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
19c40 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
19c50 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20  ull, aiMap);..  
19c60 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19c70 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
19c80 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
19c90 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
19ca0 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19cb0 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
19cc0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19cd0 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
19ce0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19cf0 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
19d00 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
19d10 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
19d20 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
19d30 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
19d40 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
19d50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
19d60 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
19d70 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
19d80 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
19d90 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
19da0 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
19db0 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
19dc0 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
19dd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
19de0 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
19df0 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
19e00 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
19e10 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
19e20 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
19e30 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
19e40 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
19e50 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
19e60 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
19e70 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
19e80 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
19e90 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
19ea0 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
19eb0 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
19ec0 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
19ed0 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
19ee0 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
19ef0 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
19f00 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
19f10 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
19f20 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
19f30 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
19f40 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
19f50 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
19f60 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
19f70 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
19f80 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
19f90 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  /.  rLhsOrig = e
19fa0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
19fb0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
19fc0 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
19fd0 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
19fe0 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
19ff0 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
1a000 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
1a010 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
1a020 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
1a030 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
1a040 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
1a050 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
1a060 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a070 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
1a080 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
1a090 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
1a0a0 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
1a0b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a0c0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a0d0 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
1a0e0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a0f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a110 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
1a120 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
1a130 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
1a140 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
1a150 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a160 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
1a170 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
1a180 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
1a190 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
1a1a0 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
1a1b0 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
1a1c0 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
1a1d0 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
1a1e0 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
1a1f0 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
1a200 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
1a210 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
1a220 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
1a230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a240 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
1a250 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
1a260 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1a270 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
1a280 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1a290 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a2a0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
1a2b0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
1a2c0 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
1a2d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a2e0 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
1a2f0 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
1a300 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
1a310 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
1a320 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1a330 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b  ->eX==EX_List );
1a340 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
1a350 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1a360 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
1a370 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
1a380 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a3a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1a3b0 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68  itAnd, rLhs, rLh
1a3c0 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  s, regCkNull);. 
1a3d0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1a3e0 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
1a3f0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1a400 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1a410 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1a420 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
1a430 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
1a440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
1a450 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
1a460 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1a470 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1a480 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1a490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a4a0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
1a4b0 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
1a4c0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
1a4d0 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
1a4e0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
1a4f0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1a500 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1a510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a520 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
1a530 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32  Lhs, labelOk, r2
1a540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a550 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a560 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1a570 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
1a580 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1a590 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
1a5a0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
1a5b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
1a5c0 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
1a5d0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1a5e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1a5f0 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20  v, zAff[0]);.   
1a600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a610 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
1a620 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1a630 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
1a640 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a650 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64  , OP_Ne, rLhs, d
1a660 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1a690 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1a6a0 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
1a6b0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
1a6c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a6d0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
1a6e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1a6f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a700 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a710 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a720 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
1a730 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
1a740 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1a750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a760 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
1a770 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
1a780 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1a790 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1a7a0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1a7b0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1a7c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1a7d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a7e0 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
1a7f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a800 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1a810 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74  CkNull);.    got
1a820 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1a830 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1a840 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20  }..  /* Step 2: 
1a850 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1a860 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73  the LHS contains
1a870 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   any NULL column
1a880 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
1a890 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  LHS does contain
1a8a0 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20   NULLs then the 
1a8b0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65  result must be e
1a8c0 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e  ither FALSE or N
1a8d0 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c  ULL..  ** We wil
1a8e0 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  l then skip the 
1a8f0 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
1a900 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1a910 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
1a920 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1a930 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
1a940 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1a950 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74  else{.    destSt
1a960 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20  ep2 = destStep6 
1a970 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a980 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20  eLabel(v);.  }. 
1a990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1a9a0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
1a9b0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
1a9c0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
1a9d0 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
1a9e0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   i);.    if( sql
1a9f0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1aa00 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  l(p) ){.      sq
1aa10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1aa20 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c  v, OP_IsNull, rL
1aa30 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29  hs+i, destStep2)
1aa40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1aa50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
1aa60 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e   }..  /* Step 3.
1aa70 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77    The LHS is now
1aa80 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
1aa90 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62  -NULL.  Do the b
1aaa0 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a  inary search.  *
1aab0 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69  * of the RHS usi
1aac0 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20  ng the LHS as a 
1aad0 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64  probe.  If found
1aae0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  , the result is.
1aaf0 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a    ** true..  */.
1ab00 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
1ab10 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
1ab20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
1ab30 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
1ab40 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
1ab50 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20  e b-tree and so 
1ab60 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b  we also.    ** k
1ab70 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53  now that the RHS
1ab80 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48   is non-NULL.  H
1ab90 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65  ence, we combine
1aba0 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20   steps 3 and 4. 
1abb0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e     ** into a sin
1abc0 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  gle opcode. */. 
1abd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1abe0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
1abf0 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  owid, pExpr->iTa
1ac00 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
1ac10 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62  , rLhs);.    Vdb
1ac20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ac30 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1ac40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac50 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20  0(v, OP_Goto);  
1ac60 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a  /* Return True *
1ac70 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
1ac80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ac90 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1aca0 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20   rLhs, nVector, 
1acb0 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72  0, zAff, nVector
1acc0 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
1acd0 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1ace0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ll ){.      /* C
1acf0 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e  ombine Step 3 an
1ad00 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20  d Step 5 into a 
1ad10 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f  single opcode */
1ad20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ad30 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
1ad40 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
1ad50 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
1ad60 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20  fFalse,.        
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
1ad90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1ada0 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  v);.      goto s
1adb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1adc0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
1add0 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79  .    /* Ordinary
1ade0 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65   Step 3, for the
1adf0 20 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53   case where FALS
1ae00 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64  E and NULL are d
1ae10 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61  istinct */.    a
1ae20 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c  ddrTruthOp = sql
1ae30 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1ae40 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
1ae50 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
1ae60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
1ae90 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
1aea0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1aeb0 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68  * Step 4.  If th
1aec0 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74  e RHS is known t
1aed0 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e  o be non-NULL an
1aee0 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e  d we did not fin
1aef0 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20  d.  ** an match 
1af00 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62  on the search ab
1af10 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1af20 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c  sult must be FAL
1af30 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  SE..  */.  if( r
1af40 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56  RhsHasNull && nV
1af50 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20  ector==1 ){.    
1af60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1af70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
1af80 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
1af90 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1afa0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1afb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1afc0 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
1afd0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1afe0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1aff0 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a  en NULL and.  **
1b000 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73   FALSE, then jus
1b010 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  t return false. 
1b020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1b030 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1b040 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ull ) sqlite3Vdb
1b050 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
1b060 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65  alse);..  /* Ste
1b070 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  p 6: Loop throug
1b080 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48  h rows of the RH
1b090 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68  S.  Compare each
1b0a0 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e   row to the LHS.
1b0b0 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d  .  ** If any com
1b0c0 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c  parison is NULL,
1b0d0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1b0e0 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c   is NULL.  If al
1b0f0 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  l.  ** compariso
1b100 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65  ns are FALSE the
1b110 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  n the final resu
1b120 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a  lt is FALSE..  *
1b130 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61  *.  ** For a sca
1b140 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73  lar LHS, it is s
1b150 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65  ufficient to che
1b160 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ck just the firs
1b170 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68  t row.  ** of th
1b180 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
1b190 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71  ( destStep6 ) sq
1b1a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b1b0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65  Label(v, destSte
1b1c0 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d  p6);.  addrTop =
1b1d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b1e0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
1b1f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b200 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b210 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b220 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
1b230 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   ){.    destNotN
1b240 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1b250 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
1b270 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63  or nVector==1, c
1b280 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61  ombine steps 6 a
1b290 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74  nd 7 by immediat
1b2a0 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20  ely returning.  
1b2b0 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68    ** FALSE if th
1b2c0 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
1b2d0 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a  on is not NULL *
1b2e0 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c  /.    destNotNul
1b2f0 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  l = destIfFalse;
1b300 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1b310 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1b320 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
1b330 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1b340 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73  ;.    int r3 = s
1b350 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1b360 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20  (pParse);.    p 
1b370 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
1b380 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
1b390 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  t, i);.    pColl
1b3a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b3b0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
1b3c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b3d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1b3e0 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
1b3f0 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20  ble, i, r3);.   
1b400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b410 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
1b420 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  s+i, destNotNull
1b430 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
1b440 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1b450 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
1b460 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43  LSEQ);.    VdbeC
1b470 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b480 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1b490 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33  mpReg(pParse, r3
1b4a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b4b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b4c0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
1b4d0 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65  Null);.  if( nVe
1b4e0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  ctor>1 ){.    sq
1b4f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b500 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74  Label(v, destNot
1b510 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1b520 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b530 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e  OP_Next, pExpr->
1b540 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b  iTable, addrTop+
1b550 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
1b560 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
1b570 20 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20   Step 7:  If we 
1b580 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1b590 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  , we know that t
1b5a0 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20  he result must. 
1b5b0 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20     ** be false. 
1b5c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1b5d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b5e0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
1b5f0 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lse);.  }..  /* 
1b600 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72  Jumps here in or
1b610 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72  der to return tr
1b620 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ue. */.  sqlite3
1b630 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1b640 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73  addrTruthOp);..s
1b650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1b660 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
1b670 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20   rLhs!=rLhsOrig 
1b680 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
1b690 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b6a0 72 4c 68 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d  rLhs);.  VdbeCom
1b6b0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
1b6c0 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65   expr"));.sqlite
1b6d0 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
1b6e0 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
1b6f0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b700 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c  b, aiMap);.  sql
1b710 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1b720 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a  e->db, zAff);.}.
1b730 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b740 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1b750 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1b760 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1b770 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
1b780 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1b790 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1b7a0 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
1b7b0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
1b7c0 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
1b7d0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1b7e0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
1b7f0 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
1b800 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
1b810 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
1b820 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
1b830 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
1b840 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1b850 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
1b860 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
1b870 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
1b880 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
1b890 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
1b8a0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
1b8b0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
1b8c0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
1b8d0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
1b8e0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
1b8f0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
1b900 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
1b910 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
1b920 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
1b930 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
1b940 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
1b950 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
1b960 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
1b970 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
1b980 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
1b990 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
1b9a0 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
1b9b0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1b9c0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1b9d0 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
1b9e0 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
1b9f0 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
1ba00 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
1ba10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1ba20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1ba30 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
1ba40 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
1ba50 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
1ba60 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
1ba70 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
1ba80 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
1ba90 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
1baa0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1bab0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bac0 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
1bad0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1bae0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
1baf0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1bb00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1bb10 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
1bb20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
1bb30 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
1bb40 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
1bb50 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
1bb60 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
1bb70 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1bb80 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
1bb90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bba0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
1bbb0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
1bbc0 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
1bbd0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
1bbe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1bbf0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1bc00 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1bc10 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
1bc20 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
1bc30 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
1bc40 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21    if( (c==3 && !
1bc50 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d  negFlag) || (c==
1bc60 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26  2) || (negFlag &
1bc70 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53  & value==SMALLES
1bc80 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65  T_INT64)){.#ifde
1bc90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1bca0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1bcb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bcc0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
1bcd0 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
1bce0 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
1bcf0 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
1bd00 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
1bd10 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
1bd20 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
1bd30 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
1bd40 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
1bd50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1bd60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1bd70 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
1bd80 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  big: %s%s", negF
1bd90 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20  lag?"-":"",z);. 
1bda0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
1bdb0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1bdc0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
1bdd0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
1bde0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1bdf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be00 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
1be10 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53  value = c==3 ? S
1be20 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
1be30 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
1be40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1be50 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
1be60 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
1be70 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
1be80 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NT64);.    }.  }
1be90 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .}.../* Generate
1bea0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1beb0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1bec0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1bed0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1bee0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1bef0 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1bf00 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1bf10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bf20 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1bf30 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1bf40 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1bf50 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bf60 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1bf70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1bf80 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1bf90 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1bfa0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1bfb0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1bfc0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1bfd0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1bfe0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1bff0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1c000 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1c010 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1c020 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1c030 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1c040 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1c050 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1c060 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1c070 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1c080 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1c090 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1c0a0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1c0b0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1c0c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c0d0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1c0e0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1c0f0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c100 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b  fTab = iTabCur +
1c110 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
1c120 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1c130 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1c140 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1c150 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1c160 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c170 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Tab = 0;.  }else
1c180 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c190 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1c1a0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56  Table(pParse->pV
1c1b0 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  dbe, pIdx->pTabl
1c1c0 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20  e, iTabCur,.    
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29  iTabCol, regOut)
1c200 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1c210 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1c220 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
1c230 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
1c240 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
1c250 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1c260 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c270 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
1c280 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
1c290 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
1c2a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c2b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1c2c0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1c2d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
1c2e0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
1c2f0 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
1c300 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
1c310 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
1c320 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
1c330 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
1c340 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
1c350 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
1c360 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
1c370 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1c380 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1c390 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
1c3a0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1c3b0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
1c3c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c3d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1c3e0 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
1c3f0 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65   regOut);.    re
1c400 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1c410 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
1c420 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
1c430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c440 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1c450 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
1c460 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1c470 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
1c480 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
1c490 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
1c4a0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
1c4b0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
1c4c0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1c4d0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
1c4e0 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
1c4f0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1c500 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
1c510 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1c520 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
1c530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c540 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
1c550 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
1c560 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
1c570 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c580 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
1c590 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
1c5a0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1c5b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c5c0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
1c5d0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
1c5e0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
1c5f0 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
1c600 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1c610 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
1c620 74 65 72 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a  ter iReg. .**.**
1c630 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1c640 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1c650 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1c660 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1c670 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1c680 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1c690 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1c6a0 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1c6b0 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1c6c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1c6d0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1c6e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c6f0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1c700 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1c710 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1c720 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1c730 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c740 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1c750 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1c760 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1c770 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c780 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c790 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1c7a0 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1c7b0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1c7c0 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1c7d0 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1c7e0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1c7f0 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1c800 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1c810 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1c820 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1c830 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1c840 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c850 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1c860 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c870 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c880 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1c890 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1c8a0 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1c8b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c8c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1c8d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1c8e0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
1c8f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
1c900 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
1c910 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
1c920 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
1c930 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
1c940 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
1c950 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c960 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1c970 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1c980 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1c990 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1c9a0 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1c9b0 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1c9c0 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1c9d0 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1c9e0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1c9f0 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1ca00 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  eg);.}../*.** Co
1ca10 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65  nvert a scalar e
1ca20 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
1ca30 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20  o a TK_REGISTER 
1ca40 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72  referencing.** r
1ca50 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1ca60 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1ca70 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20  nsure that iReg 
1ca80 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
1ca90 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1caa0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78  value for the ex
1cab0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
1cac0 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52  tic void exprToR
1cad0 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c  egister(Expr *p,
1cae0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d   int iReg){.  p-
1caf0 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  >op2 = p->op;.  
1cb00 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  p->op = TK_REGIS
1cb10 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  TER;.  p->iTable
1cb20 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43   = iReg;.  ExprC
1cb30 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20  learProperty(p, 
1cb40 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a  EP_Skip);.}../*.
1cb50 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65  ** Evaluate an e
1cb60 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65  xpression (eithe
1cb70 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20  r a vector or a 
1cb80 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1cb90 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  n) and store.** 
1cba0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f  the result in co
1cbb0 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72  ntinguous tempor
1cbc0 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20  ary registers.  
1cbd0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1cbe0 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   of.** the first
1cbf0 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74   register used t
1cc00 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1cc10 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
1cc20 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1cc30 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
1cc40 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c  emporary scalar,
1cc50 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65   then also write
1cc60 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65  .** that registe
1cc70 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  r number into *p
1cc80 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74  iFreeable.  If t
1cc90 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1cca0 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69  lt register.** i
1ccb0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
1ccc0 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  y or if the expr
1ccd0 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74  ession is a vect
1cce0 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62  or set *piFreeab
1ccf0 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73  le.** to 0..*/.s
1cd00 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
1cd10 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a  deVector(Parse *
1cd20 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
1cd30 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65   int *piFreeable
1cd40 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74  ){.  int iResult
1cd50 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20  ;.  int nResult 
1cd60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
1cd70 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66  torSize(p);.  if
1cd80 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a  ( nResult==1 ){.
1cd90 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1cda0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1cdb0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46  p(pParse, p, piF
1cdc0 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73  reeable);.  }els
1cdd0 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62  e{.    *piFreeab
1cde0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
1cdf0 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
1ce00 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
1ce10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1ce20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a     iResult = 0;.
1ce30 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73  #else.      iRes
1ce40 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ult = sqlite3Cod
1ce50 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
1ce60 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  e, p, 0, 0);.#en
1ce70 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1ce80 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1ce90 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72    iResult = pPar
1cea0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1ceb0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1cec0 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  = nResult;.     
1ced0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
1cee0 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
1cef0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cf00 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
1cf10 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  rse, p->x.pList-
1cf20 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69  >a[i].pExpr, i+i
1cf30 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
1cf40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cf50 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn iResult;.}..
1cf60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cf70 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
1cf80 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
1cf90 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
1cfa0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
1cfb0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
1cfc0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1cfd0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
1cfe0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
1cff0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
1d000 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1d010 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
1d020 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1d030 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
1d040 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
1d050 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
1d060 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
1d070 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
1d080 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
1d090 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
1d0a0 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
1d0b0 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
1d0c0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1d0d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
1d0e0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
1d0f0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
1d100 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
1d110 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
1d120 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
1d130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d140 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
1d150 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1d160 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
1d170 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d180 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
1d190 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
1d1a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
1d1b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d1c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
1d1d0 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
1d1e0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
1d1f0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
1d200 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
1d210 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
1d220 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
1d230 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
1d240 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
1d250 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
1d260 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
1d270 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1d280 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1d290 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1d2a0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1d2b0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1d2c0 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20   r1, r2;        
1d2d0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
1d2e0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
1d2f0 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  rs */.  Expr tem
1d300 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1d310 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
1d320 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
1d330 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a  /.  int p5 = 0;.
1d340 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1d350 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1d360 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1d370 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1d380 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1d390 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1d3a0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
1d3b0 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64  0;.  }..expr_cod
1d3c0 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20  e_doover:.  if( 
1d3d0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1d3e0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1d3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1d400 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1d410 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1d420 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1d430 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1d440 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1d450 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1d460 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1d470 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1d480 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1d490 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1d4a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1d4b0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1d4c0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1d4d0 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1d4e0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1d4f0 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1d500 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d510 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1d520 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1d530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d540 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1d550 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1d560 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1d590 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1d5a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d5b0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1d5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1d5d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1d5e0 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1d5f0 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1d600 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1d610 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1d620 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1d630 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1d640 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1d650 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d660 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20  P_FixedCol) ){. 
1d670 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43         /* This C
1d680 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
1d690 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e   is really a con
1d6a0 73 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45  stant due to WHE
1d6b0 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  RE clause.      
1d6c0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73    ** constraints
1d6d0 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74  , and that const
1d6e0 61 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20  ant is coded by 
1d6f0 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
1d700 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72  .        ** expr
1d710 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65  esssion.  Howeve
1d720 72 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  r, make sure the
1d730 20 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68   constant has th
1d740 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1d750 20 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79    ** datatype by
1d760 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66   applying the Af
1d770 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61  finity of the ta
1d780 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  ble column to th
1d790 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  e.        ** con
1d7a0 73 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a  stant..        *
1d7b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
1d7c0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1d7d0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1d7e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d7f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1d800 20 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74   int aff = sqlit
1d810 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
1d820 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 54 61  inity(pExpr->pTa
1d830 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  b, pExpr->iColum
1d840 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1d850 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
1d860 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
1d870 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1d880 68 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c  har zAff[] = "B\
1d890 30 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b  000C\000D\000E";
1d8a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1d8b0 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  t( SQLITE_AFF_BL
1d8c0 4f 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20  OB=='A' );.     
1d8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1d8e0 49 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42  ITE_AFF_TEXT=='B
1d8f0 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ' );.          i
1d900 66 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20  f( iReg!=target 
1d910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1d920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d930 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52  (v, OP_SCopy, iR
1d940 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1d950 20 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20           iReg = 
1d960 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20  target;.        
1d970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
1d980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d990 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1d9a0 69 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20  iReg, 1, 0,.    
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61          &zAff[(a
1d9d0 66 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53  ff-'B')*2], P4_S
1d9e0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1d9f0 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1da00 20 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20   iReg;.      }. 
1da10 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1da20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1da30 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1da40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1da50 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1da60 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1da70 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1da80 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1da90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1daa0 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1dab0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1dac0 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1dad0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1dae0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1daf0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1db00 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1db10 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1db20 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1db30 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1db40 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1db50 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1db60 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1db70 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1db80 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1db90 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1dba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1dbb0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1dbc0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1dbd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1dbe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1dc10 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1dc40 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1dc50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1dc60 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1dc70 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1dc80 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1dc90 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1dca0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1dcb0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45      case TK_TRUE
1dcc0 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  FALSE: {.      s
1dcd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dce0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1dcf0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1dd00 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61  Value(pExpr), ta
1dd10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1dd20 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1dd30 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1dd40 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1dd50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1dd60 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1dd70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1dd80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1dd90 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1dda0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1ddb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ddc0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1ddd0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1dde0 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1ddf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1de00 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1de10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1de20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1de30 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1de40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1de50 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1de60 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1de70 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ken);.      retu
1de80 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1de90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1dea0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1deb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dec0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1ded0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1dee0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1def0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1df00 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1df10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1df20 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1df30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1df40 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1df50 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1df60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1df70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1df80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1df90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1dfa0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1dfb0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1dfc0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1dfd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dfe0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1dff0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1e000 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1e010 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1e020 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1e030 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1e040 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1e050 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1e060 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1e070 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1e080 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1e090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e0a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1e0b0 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1e0c0 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1e0d0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1e0e0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e0f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e100 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1e110 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1e120 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e130 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e140 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e150 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e160 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1e170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e180 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1e190 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e1a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e1b0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1e1c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1e1d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1e1e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e1f0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1e200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1e210 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  = sqlite3VListNu
1e220 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
1e230 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69  pVList, pExpr->i
1e240 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1e250 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e260 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1e270 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
1e280 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d  ->u.zToken, z)==
1e290 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1e2a0 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d  rse->pVList[0] =
1e2b0 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20   0; /* Indicate 
1e2c0 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e  VList may no lon
1e2d0 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20  ger be enlarged 
1e2e0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1e2f0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1e300 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53  , (char*)z, P4_S
1e310 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1e320 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e330 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1e340 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1e350 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1e360 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e370 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e380 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1e390 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1e3a0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1e3b0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1e3c0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1e3d0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1e3e0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1e3f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1e400 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1e410 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1e420 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1e430 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1e440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1e460 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1e470 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1e480 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1e490 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1e4a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e4b0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1e4e0 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1e4f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1e500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1e510 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1e520 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1e530 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1e540 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1e550 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1e560 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1e570 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1e580 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1e590 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1e5a0 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1e5b0 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1e5c0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1e5d0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1e5e0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1e5f0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1e600 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1e610 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1e620 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1e630 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1e640 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1e650 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1e660 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1e670 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1e680 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1e690 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1e6a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e6b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e6c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e6d0 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1e6e0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1e6f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e700 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e710 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1e720 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e730 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1e740 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1e750 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1e760 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1e770 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1e780 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1e790 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e7a0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1e7b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1e7c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1e7d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1e7e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e7f0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1e800 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1e810 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e820 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1e830 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e840 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1e850 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1e860 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1e870 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1e880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e890 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1e8a0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1e8b0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e8c0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1e8d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e8e0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e8f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e900 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e910 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e930 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1e940 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1e950 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e960 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1e970 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e980 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e990 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e9a0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e9b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e9d0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1e9e0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1e9f0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1ea00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1ea10 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1ea20 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1ea30 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1ea40 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1ea50 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1ea60 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1ea70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1ea80 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1ea90 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1eaa0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1eab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1eac0 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1ead0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1eae0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1eaf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1eb00 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1eb20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1eb30 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1eb40 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1eb50 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1eb60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1eb70 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1eb80 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1eb90 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1eba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ebb0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1ebc0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1ebd0 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1ebe0 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1ebf0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1ec00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ec10 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1ec20 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1ec30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1ec40 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1ec50 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1ec60 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1ec70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ec80 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1ec90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1eca0 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1ecb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ecc0 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1ecd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ece0 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1ecf0 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1ed00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1ed10 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1ed20 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1ed30 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1ed40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ed50 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1ed60 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1ed70 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1ed80 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1ed90 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1eda0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1edb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1edc0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1edd0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1ede0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1edf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ee00 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1ee10 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1ee20 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1ee30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ee40 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1ee50 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1ee60 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1ee70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1ee80 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1ee90 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1eea0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eeb0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1eec0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1eed0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1eee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1eef0 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1ef00 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1ef10 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1ef20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1ef30 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1ef40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ef50 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1ef60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ef70 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1ef80 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1ef90 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1efa0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1efb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1efc0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1efd0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1efe0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1eff0 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1f000 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1f010 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f020 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1f030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f040 20 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 6d       memset(&tem
1f050 70 58 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 65  pX, 0, sizeof(te
1f060 6d 70 58 29 29 3b 0a 20 20 20 20 20 20 20 20 74  mpX));.        t
1f070 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
1f080 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
1f090 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
1f0a0 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
1f0b0 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
1f0c0 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
1f0d0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
1f0e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f0f0 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
1f100 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1f110 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1f120 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f130 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f140 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
1f150 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f160 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f170 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
1f180 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f1a0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f1c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f1d0 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1f1e0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1f1f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f200 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1f210 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1f220 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1f230 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f240 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1f250 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1f260 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1f270 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f290 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f2a0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f2b0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1f2c0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f2d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f2e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1f2f0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1f300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1f320 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TH: {.      int 
1f330 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53  isTrue;    /* IS
1f340 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
1f350 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  TRUE */.      in
1f360 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20  t bNormal;   /* 
1f370 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41  IS TRUE or IS FA
1f380 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  LSE */.      r1 
1f390 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f3a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f3b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f3c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1f3d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f3e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54  ==0 );.      isT
1f3f0 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
1f400 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1f410 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1f420 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70    bNormal = pExp
1f430 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20  r->op2==TK_IS;. 
1f440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1f450 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c  sTrue && bNormal
1f460 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f470 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e  e( !isTrue && bN
1f480 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71  ormal);.      sq
1f490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1f4a0 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c  nt(v, OP_IsTrue,
1f4b0 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54   r1, inReg, !isT
1f4c0 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e  rue, isTrue ^ bN
1f4d0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  ormal);.      br
1f4e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f4f0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1f500 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1f510 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1f520 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1f530 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1f540 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1f550 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1f560 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1f570 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1f580 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1f590 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f5a0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1f5b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f5c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f5d0 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1f5e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f5f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f600 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f610 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f620 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f630 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f640 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1f650 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1f660 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1f670 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f680 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1f690 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f6a0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f6b0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1f6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f6d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1f6e0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1f6f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f700 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1f710 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f720 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f730 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1f740 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1f750 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
1f760 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1f770 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
1f780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f790 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f7a0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f7b0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1f7c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f7d0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
1f7e0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
1f7f0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
1f800 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1f810 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1f820 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  rn pInfo->aFunc[
1f830 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1f840 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1f850 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f860 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1f870 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1f880 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1f890 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1f8a0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1f8b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1f8c0 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1f8d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1f8e0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1f8f0 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
1f900 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
1f910 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1f920 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
1f930 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
1f940 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
1f950 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1f960 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
1f970 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
1f980 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
1f990 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1f9a0 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
1f9b0 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
1f9c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1f9d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f9e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1f9f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1fa00 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
1fa10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1fa20 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
1fa30 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
1fa40 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
1fa50 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1fa60 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
1fa70 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
1fa80 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
1fa90 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
1faa0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69   sequence */..#i
1fab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fac0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
1fad0 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
1fae0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1faf0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1fb00 65 64 75 63 65 64 29 20 26 26 20 70 45 78 70 72  educed) && pExpr
1fb10 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ->pWin ){.      
1fb20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1fb30 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 3b  pWin->regResult;
1fb40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1fb50 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73 74  .      if( Const
1fb60 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1fb70 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1fb80 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
1fb90 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
1fba0 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69     /* SQL functi
1fbb0 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ons can be expen
1fbc0 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f 20  sive. So try to 
1fbd0 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66 75  move constant fu
1fbe0 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  nctions.        
1fbf0 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ** out of the in
1fc00 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20 69  ner loop, even i
1fc10 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e 20  f that means an 
1fc20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20 2a  extra OP_Copy. *
1fc30 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
1fc40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fc50 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
1fc60 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Expr, -1);.     
1fc70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1fc80 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c   pExpr->eX==EX_L
1fc90 69 73 74 20 7c 7c 20 70 45 78 70 72 2d 3e 65 58  ist || pExpr->eX
1fca0 3d 3d 45 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  ==EX_None );.   
1fcb0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1fcc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1fcd0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1fce0 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1fcf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1fd00 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1fd10 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1fd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1fd30 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1fd40 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1fd50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1fd60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fd70 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1fd80 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1fd90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1fda0 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1fdb0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1fdc0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1fdd0 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1fde0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1fdf0 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1fe00 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1fe10 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1fe20 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1fe30 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1fe40 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1fe50 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1fe60 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1fe70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1fe80 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1fe90 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1fea0 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1feb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1fec0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1fed0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1fee0 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1fef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ff00 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1ff10 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1ff20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ff30 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1ff40 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1ff50 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1ff60 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1ff70 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1ff80 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1ff90 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1ffa0 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1ffb0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1ffc0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1ffd0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1ffe0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fff0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
20000 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
20010 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
20020 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
20030 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20040 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
20050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20060 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20070 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20080 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20090 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
200a0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
200b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
200c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
200d0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
200e0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
200f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20100 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
20110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20120 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20130 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
20140 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
20150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20160 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20170 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
20180 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20190 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
201a0 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
201b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
201c0 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
201d0 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
201e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
201f0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
20200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20210 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20220 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
20230 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
20240 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20250 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
20260 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
20270 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
20280 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
20290 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
202a0 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
202b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
202c0 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49 4e 49     /* The AFFINI
202d0 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 65 76  TY() function ev
202e0 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73 74 72  aluates to a str
202f0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
20300 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
20310 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
20320 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
20330 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
20340 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20 20 20   testing of.    
20350 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
20360 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20  type logic..    
20370 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20380 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
20390 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46   SQLITE_FUNC_AFF
203a0 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20 20 20  INITY ){.       
203b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
203c0 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c  ff[] = { "blob",
203d0 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65 72 69   "text", "numeri
203e0 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22  c", "integer", "
203f0 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20  real" };.       
20400 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20   char aff;.     
20410 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20420 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
20430 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
20440 41 66 66 69 6e 69 74 79 28 70 46 61 72 67 2d 3e  Affinity(pFarg->
20450 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
20460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20470 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
20480 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20 20 20  rget, .         
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41 66 66       aff ? azAff
204b0 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f  [aff-SQLITE_AFF_
204c0 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b  BLOB] : "none");
204d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
204e0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
204f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f  #endif..      fo
20500 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
20510 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
20520 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
20530 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
20540 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
20550 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
20560 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20  testcase( i==31 
20570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
20580 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  stMask |= MASKBI
20590 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20  T32(i);.        
205a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
205b0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
205c0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
205d0 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
205e0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
205f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
20600 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
20610 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
20620 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20630 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20640 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
20650 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61       if( constMa
20660 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sk ){.          
20670 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  r1 = pParse->nMe
20680 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m+1;.          p
20690 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
206a0 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65  Farg;.        }e
206b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
206c0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
206d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
206e0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  nFarg);.        
206f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  }..        /* Fo
20700 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74  r length() and t
20710 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
20720 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20  s with a column 
20730 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20  argument,.      
20740 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20    ** set the P5 
20750 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65  parameter to the
20760 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
20770 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  e to OPFLAG_LENG
20780 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a  THARG.        **
20790 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f   or OPFLAG_TYPEO
207a0 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c  FARG respectivel
207b0 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  y, to avoid unne
207c0 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20  cessary data.   
207d0 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e       ** loading.
207e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
207f0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20800 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
20810 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53  TE_FUNC_LENGTH|S
20820 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
20830 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  F))!=0 ){.      
20840 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20      u8 exprOp;. 
20850 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20860 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
20870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20880 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20890 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
208a0 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d   exprOp = pFarg-
208b0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b  >a[0].pExpr->op;
208c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
208d0 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  xprOp==TK_COLUMN
208e0 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41   || exprOp==TK_A
208f0 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
20900 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20910 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
20920 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47  GTH==OPFLAG_LENG
20930 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
20940 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
20950 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d  ITE_FUNC_TYPEOF=
20960 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  =OPFLAG_TYPEOFAR
20970 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
20980 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d   testcase( pDef-
20990 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46  >funcFlags & OPF
209a0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
209b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61  .            pFa
209c0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
209d0 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20  op2 = .         
209e0 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66           pDef->f
209f0 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c  uncFlags & (OPFL
20a00 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
20a10 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
20a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20a30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73      }..        s
20a40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
20a50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
20a60 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20  Farg, r1, 0,.   
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
20a90 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
20aa0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
20ab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20ac0 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
20ad0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
20ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
20af0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
20b00 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
20b10 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
20b20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
20b30 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
20b40 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
20b50 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
20b60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
20b70 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
20b80 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
20b90 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
20ba0 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
20bb0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20bc0 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
20bd0 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
20be0 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
20bf0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
20c00 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
20c10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
20c20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
20c30 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
20c40 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
20c50 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
20c60 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
20c70 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
20c80 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
20c90 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
20ca0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
20cb0 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
20cc0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
20cd0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
20ce0 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
20cf0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
20d00 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
20d10 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
20d20 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
20d30 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
20d40 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
20d50 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
20d60 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
20d70 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
20d80 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
20d90 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
20da0 67 3e 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  g>=2 && ExprHasP
20db0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20dc0 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
20dd0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20de0 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
20df0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
20e00 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
20e10 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
20e20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20e30 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
20e40 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
20e50 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
20e60 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
20e70 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
20e80 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
20e90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20ea0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20eb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20ec0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
20ed0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
20ee0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
20ef0 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
20f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f10 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
20f20 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
20f30 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
20f40 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
20f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20f60 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
20f70 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  _FUNC.      if( 
20f80 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20f90 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46  & SQLITE_FUNC_OF
20fa0 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20  FSET ){.        
20fb0 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61  Expr *pArg = pFa
20fc0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  rg->a[0].pExpr;.
20fd0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
20fe0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
20ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21000 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
21010 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72  , OP_Offset, pAr
21020 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d  g->iTable, pArg-
21030 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
21040 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21050 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21070 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
21080 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
21090 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
210a0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
210b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
210c0 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e  dOp4(v, pParse->
210d0 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75  iSelfTab ? OP_Pu
210e0 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e  reFunc0 : OP_Fun
210f0 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20  ction0,.        
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c    constMask, r1,
21120 20 74 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29   target, (char*)
21130 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
21140 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21150 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
21160 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
21170 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21180 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
21190 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
211a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
211b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
211c0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
211d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
211e0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
211f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21200 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
21210 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
21220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
21230 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
21240 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73   nCol;.      tes
21250 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
21260 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
21270 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
21280 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
21290 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  f( op==TK_SELECT
212a0 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70   && (nCol = pExp
212b0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
212c0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20  List->nExpr)!=1 
212d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
212e0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
212f0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31  (pParse, nCol, 1
21300 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
21320 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
21330 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
21340 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
21350 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
21360 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21370 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20  _SELECT_COLUMN: 
21380 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
21390 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
213a0 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30  pLeft->iTable==0
213b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
213c0 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
213d0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
213e0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
213f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c  pExpr->pLeft, 0,
21400 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
21410 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21420 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
21430 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
21440 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
21450 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
21460 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20  Table.       && 
21470 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28  pExpr->iTable!=(
21480 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  n = sqlite3ExprV
21490 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
214a0 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20  >pLeft)) .      
214b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
214c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
214d0 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61  e, "%d columns a
214e0 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65  ssigned %d value
214f0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
21520 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, n);.      }. 
21530 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
21540 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
21550 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
21560 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  n;.    }.    cas
21570 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
21580 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
21590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
215a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
215b0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
215c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
215d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
215e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
215f0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
21600 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
21610 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21620 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
21630 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
21640 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
21650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21660 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
21670 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
21680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21690 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
216a0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
216b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
216c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
216d0 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  Imm, target, 0);
216e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
216f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
21700 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
21710 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
21720 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
21730 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21740 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
21750 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
21760 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
21770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21780 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
21790 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
217a0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
217b0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
217c0 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
217d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
217e0 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
217f0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
21800 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
21810 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
21820 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
21830 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
21840 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
21850 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
21860 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
21870 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
21880 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b  , target, 0, 0);
21890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
218a0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
218b0 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20  case TK_SPAN:.  
218c0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
218d0 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
218e0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70  UPLUS: {.      p
218f0 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
21900 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  eft;.      goto 
21910 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72  expr_code_doover
21920 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a  ; /* 2018-04-28:
21930 20 50 72 65 76 65 6e 74 20 64 65 65 70 20 72 65   Prevent deep re
21940 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a  cursion. OSSFuzz
21950 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  . */.    }..    
21960 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
21970 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
21980 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
21990 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
219a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
219b0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
219c0 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
219d0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
219e0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
219f0 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
21a00 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
21a10 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
21a20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
21a30 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
21a40 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
21a50 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
21a60 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
21a70 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
21a80 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
21a90 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
21aa0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
21ab0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
21ac0 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
21ad0 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
21ae0 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
21af0 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
21b00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
21b10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
21b20 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
21b30 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
21b40 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
21b50 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
21b60 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
21b70 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
21b80 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
21b90 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
21ba0 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
21bb0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
21bc0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
21bd0 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
21be0 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
21bf0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
21c00 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
21c10 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
21c20 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
21c30 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
21c40 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
21c50 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
21c60 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
21c70 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
21c80 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
21c90 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
21ca0 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
21cb0 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
21cc0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
21cd0 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
21ce0 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
21cf0 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
21d00 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
21d10 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
21d20 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
21d30 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
21d40 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
21d50 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
21d60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21d70 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
21d80 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
21d90 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
21da0 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
21db0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
21dc0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21dd0 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
21de0 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
21df0 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
21e00 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
21e10 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
21e20 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
21e30 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
21e40 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
21e50 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
21e60 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
21e70 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
21e80 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
21e90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21ea0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
21eb0 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
21ec0 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
21ed0 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
21ee0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21ef0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
21f00 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21f10 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
21f20 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
21f30 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
21f40 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
21f50 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
21f60 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
21f70 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
21f80 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
21f90 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
21fa0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
21fb0 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
21fc0 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
21fd0 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
21fe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21ff0 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
22000 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
22010 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22020 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72  [%d]=%s.%s", tar
22030 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45  get,.        (pE
22040 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
22050 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
22060 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
22070 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
22080 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
22090 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
220a0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20  lumn].zName).   
220b0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
220c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
220d0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
220e0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
220f0 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
22100 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
22110 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
22120 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
22130 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
22140 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
22150 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
22160 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
22170 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
22180 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
22190 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
221a0 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
221b0 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
221c0 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
221d0 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
221e0 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
221f0 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
22200 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
22210 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
22220 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
22230 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
22240 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
22250 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
22260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22270 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22280 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
22290 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
222a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
222b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
222c0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
222d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
222e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
222f0 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
22300 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72  used");.      br
22310 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
22320 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
22330 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ROW: {.      int
22340 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20 20 20   addrINR;.      
22350 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69 74 65  addrINR = sqlite
22360 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
22370 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78  P_IfNullRow, pEx
22380 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
22390 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
223a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
223b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
223c0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
223d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
223e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
223f0 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  rINR);.      sql
22400 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
22410 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52  (v, addrINR, inR
22420 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
22430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
22440 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
22450 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
22460 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
22470 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
22480 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
22490 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
224a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
224b0 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
224c0 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
224d0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
224e0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
224f0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22510 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
22520 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
22530 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
22540 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
22550 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
22560 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
22570 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
22580 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
22590 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
225a0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
225b0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
225c0 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
225d0 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
225e0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
225f0 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
22600 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
22610 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
22620 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
22630 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
22640 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
22650 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
22660 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
22670 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
22680 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
22690 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
226a0 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
226b0 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
226c0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
226d0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
226e0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
226f0 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
22700 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
22710 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
22720 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
22730 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
22740 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
22750 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
22760 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
22770 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
22780 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
22790 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
227a0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
227b0 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
227c0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
227d0 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
227e0 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
227f0 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
22820 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
22830 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
22840 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
22870 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
22880 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
22890 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
228b0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
228c0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
228d0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22900 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
22910 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
22940 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
22950 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22960 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
22970 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
22980 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22990 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
229c0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
229d0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
22a00 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
22a10 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
22a20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22a30 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
22a40 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
22a50 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20  i (form B) */.. 
22a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22a70 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20  pr->eX==EX_List 
22a80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22a90 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
22aa0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
22ab0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
22ac0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
22ad0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
22ae0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
22af0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
22b00 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
22b10 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
22b20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
22b30 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
22b40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
22b50 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
22b60 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
22b70 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
22b80 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
22b90 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
22ba0 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
22bb0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
22bc0 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
22bd0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
22be0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
22bf0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
22c00 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
22c10 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
22c20 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
22c30 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
22c40 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
22c50 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
22c60 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
22c70 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
22c80 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
22c90 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
22ca0 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
22cb0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
22cc0 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
22cd0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
22ce0 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
22cf0 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
22d00 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
22d10 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
22d20 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
22d30 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
22d40 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
22d50 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
22d60 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
22d70 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
22d80 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
22d90 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
22da0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
22dc0 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
22dd0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
22de0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22df0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
22e00 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
22e10 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
22e20 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
22e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22e40 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
22e50 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
22e60 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
22e70 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
22e80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22e90 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
22ea0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
22eb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
22ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22ed0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22ee0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
22ef0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
22f00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
22f10 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
22f20 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
22f30 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
22f40 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
22f50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22f60 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
22f70 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
22f80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22f90 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
22fa0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
22fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22fc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
22fd0 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
22fe0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
22ff0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
23000 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23010 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
23020 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
23030 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
23040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23060 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
23070 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
23080 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23090 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
230a0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
230b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
230c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
230d0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
230e0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
230f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
23100 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23110 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
23120 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23130 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23140 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
23150 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23160 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
23170 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
23180 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23190 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
231a0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
231b0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
231c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
231d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
231e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
231f0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
23200 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
23210 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
23220 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
23230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
23240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23250 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
23260 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
23270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
23280 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
23290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
232a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
232b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
232c0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
232d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
232e0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
232f0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
23300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23310 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
23320 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
23330 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
23340 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
23350 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
23360 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
23370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23380 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
23390 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
233a0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
233b0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
233e0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
233f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
23400 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
23410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23420 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
23430 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23440 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23450 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
23460 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23470 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
23480 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
23490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
234a0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
234b0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
234c0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
234d0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
234e0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
234f0 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
23500 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
23510 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
23520 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
23530 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
23540 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
23550 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
23560 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
23570 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
23580 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
23590 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
235a0 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
235b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
235c0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
235d0 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
235e0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
235f0 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
23600 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
23610 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
23620 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
23630 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23640 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
23650 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
23660 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23670 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
23680 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23690 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
236a0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
236b0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
236c0 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
236d0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
236e0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
236f0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
23700 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
23710 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
23720 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
23730 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
23740 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
23750 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
23760 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23770 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
23780 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23790 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
237a0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
237b0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
237c0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
237d0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
237e0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
237f0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
23800 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
23810 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
23820 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
23830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23840 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
23850 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
23860 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
23870 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
23880 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
23890 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
238a0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
238b0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
238c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
238d0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
238e0 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
238f0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
23900 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
23910 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
23920 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
23930 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
23940 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
23950 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
23960 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
23970 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
23980 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
23990 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
239a0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
239b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
239c0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
239d0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
239e0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
239f0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
23a00 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
23a10 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
23a20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23a30 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
23a40 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
23a50 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
23a60 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
23a70 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
23a80 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
23a90 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
23aa0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
23ab0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
23ac0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
23ad0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
23ae0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
23af0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
23b00 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
23b10 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
23b20 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
23b30 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
23b40 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
23b50 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
23b60 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
23b70 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
23b80 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
23b90 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
23ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
23bb0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
23bc0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23bd0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
23be0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
23bf0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23c00 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
23c10 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
23c20 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
23c30 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
23c40 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
23c50 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
23c60 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
23c70 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
23c80 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
23c90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
23ca0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
23cb0 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
23cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
23cd0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
23ce0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
23cf0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
23d00 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
23d10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23d20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
23d30 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
23d40 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
23d50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
23d60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23d70 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
23d80 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
23d90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23da0 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
23db0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
23dc0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
23dd0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
23de0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
23df0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
23e00 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
23e10 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
23e20 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
23e30 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
23e40 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
23e50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
23e60 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23e70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
23e80 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
23e90 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
23ea0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
23eb0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
23ec0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
23ed0 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
23ee0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
23ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23f00 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
23f10 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
23f20 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
23f30 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
23f40 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
23f50 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
23f60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23f70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
23f80 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
23f90 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
23fa0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
23fb0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
23fc0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
23fd0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
23fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ff0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
24000 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
24010 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
24020 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24030 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
24040 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
24050 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24060 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
24070 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
24080 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
24090 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
240a0 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
240b0 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
240c0 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
240d0 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
240e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
240f0 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
24100 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24110 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
24120 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24130 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24140 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
24150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24160 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24170 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
24180 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
24190 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
241a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
241b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
241c0 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
241d0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
241e0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
241f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24200 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
24210 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
24220 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
24230 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24240 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24250 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24260 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
24270 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
24280 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
24290 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
242a0 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
242b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
242c0 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
242d0 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
242e0 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
242f0 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
24300 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24310 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
24320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
24330 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24340 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
24350 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
24360 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
24370 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
24380 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
24390 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
243a0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
243b0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
243c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
243d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
243e0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
243f0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
24400 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
24410 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
24420 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
24430 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
24440 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
24450 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
24460 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
24470 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
24480 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
24490 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
244a0 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
244b0 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
244c0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
244d0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
244e0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
244f0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
24500 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
24510 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
24520 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24530 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
24540 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
24550 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
24560 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
24570 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
24580 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
24590 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
245a0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
245b0 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
245c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
245d0 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
245e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
245f0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24600 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
24610 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24620 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
24630 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
24640 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24650 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
24660 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
24670 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24680 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24690 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
246a0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
246b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
246c0 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
246d0 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
246e0 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
246f0 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
24700 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24710 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
24720 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
24730 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
24740 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
24750 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
24760 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
24770 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
24780 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
24790 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
247a0 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
247b0 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  ed.  The number 
247c0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a  returned will.**
247d0 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73   usually be pLis
247e0 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67  t->nExpr but mig
247f0 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69 66  ht be reduced if
24800 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
24810 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TREF.** is defin
24820 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
24830 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
24840 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
24850 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
24860 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
24870 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
24880 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
24890 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
248a0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
248b0 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
248c0 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
248d0 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
248e0 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
248f0 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
24900 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
24910 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
24920 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
24930 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
24940 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
24950 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
24960 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
24970 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
24980 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
24990 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
249a0 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
249b0 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
249c0 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
249d0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
249e0 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  re..** If SQLITE
249f0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73  _ECEL_OMITREF is
24a00 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20   also set, then 
24a10 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68 20  the values with 
24a20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
24a30 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20  0.** are simply 
24a40 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20 74  omitted rather t
24a50 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64  han being copied
24a60 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f   from srcReg..*/
24a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
24a80 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
24a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24aa0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24ab0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
24ac0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
24ad0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
24ae0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
24af0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
24b00 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
24b10 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
24b20 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
24b30 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
24b40 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
24b50 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
24b60 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
24b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
24b80 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
24b90 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
24ba0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24bb0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
24bc0 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
24bd0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24be0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
24bf0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
24c00 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
24c10 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24c20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
24c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
24c40 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
24c50 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
24c60 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
24c70 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
24c80 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
24c90 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
24ca0 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
24cb0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
24cc0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
24cd0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
24ce0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
24cf0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
24d00 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
24d10 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
24d20 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66  Item->pExpr;.#if
24d30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
24d40 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
24d50 43 45 53 0a 20 20 20 20 69 66 28 20 70 49 74 65  CES.    if( pIte
24d60 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  m->bSorterRef ){
24d70 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20  .      i--;.    
24d80 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
24d90 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
24da0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24db0 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
24dc0 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  (j = pItem->u.x.
24dd0 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
24de0 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
24df0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
24e00 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20  OMITREF ){.     
24e10 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20     i--;.        
24e20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
24e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
24e50 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
24e60 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
24e70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
24e80 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
24e90 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
24ea0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
24eb0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24ec0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
24ed0 45 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  Expr).    ){.   
24ee0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24ef0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24f00 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
24f10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24f20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
24f30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24f40 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
24f50 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
24f60 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
24f70 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
24f80 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
24f90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
24fa0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
24fb0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
24fc0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
24fd0 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
24fe0 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
24ff0 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
25000 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
25010 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25020 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
25030 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
25040 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
25050 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
25060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
25070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25080 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
25090 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
250a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
250b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
250c0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
250d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
250e0 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
250f0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
25100 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
25110 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
25120 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
25130 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
25140 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
25150 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
25160 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
25170 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
25180 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
25190 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
251a0 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
251b0 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
251c0 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
251d0 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
25200 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
25210 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
25220 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
25230 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25240 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
25250 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25260 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
25270 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
25280 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
25290 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
252a0 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
252b0 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
252c0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
252d0 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
252e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
252f0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
25300 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
25310 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
25320 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
25330 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
25340 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
25350 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
25360 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
25370 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
25380 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
25390 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
253a0 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
253b0 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
253c0 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
253d0 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
253e0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
253f0 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
25400 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78  L */.){. Expr ex
25410 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
25420 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
25430 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
25440 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
25450 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
25460 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
25470 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
25480 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
25490 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
254a0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
254b0 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
254c0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
254d0 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
254e0 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
254f0 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65  gister */...  me
25500 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
25510 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
25520 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
25530 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
25540 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25550 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
25560 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
25570 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25580 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a 20  eX==EX_List );. 
25590 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
255a0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
255b0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
255c0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
255d0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
255e0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
255f0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
25600 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
25610 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
25620 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
25630 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
25640 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
25650 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
25660 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
25670 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
25680 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
25690 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
256a0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
256b0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
256c0 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
256d0 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
256e0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
256f0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
25700 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
25710 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
25720 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
25730 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25740 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
25750 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78    /* Mark the ex
25760 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e  pression is bein
25770 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  g from the ON or
25780 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
25790 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73   a join.    ** s
257a0 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  o that the sqlit
257b0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
257c0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
257d0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d  not attempt to m
257e0 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  ove.    ** it in
257f0 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f  to the Parse.pCo
25800 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57  nstExpr list.  W
25810 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e  e should use a n
25820 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c  ew bit for this,
25830 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72  .    ** for clar
25840 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20  ity, but we are 
25850 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74  out of bits in t
25860 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  he Expr.flags fi
25870 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a  eld so we.    **
25880 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74   have to reuse t
25890 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62  he EP_FromJoin b
258a0 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a  it.  Bummer. */.
258b0 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20      exprX.flags 
258c0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
258d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
258e0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
258f0 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
25900 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25910 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
25920 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
25930 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
25940 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
25950 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
25960 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25970 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
25980 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
25990 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
259a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
259b0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
259c0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
259d0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
259e0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
259f0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25a00 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
25a10 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
25a20 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
25a30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25a40 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25a50 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25a60 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
25a70 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
25a80 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25a90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25aa0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
25ab0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
25ac0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25ad0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25ae0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25af0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
25b00 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
25b10 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25b20 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
25b30 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
25b40 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
25b50 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
25b60 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25b70 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
25b80 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
25b90 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
25ba0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25bb0 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mp==0 );.}../*.*
25bc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25bd0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
25be0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
25bf0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
25c00 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
25c10 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
25c20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
25c30 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
25c40 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
25c50 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
25c60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25c70 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
25c80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25c90 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
25ca0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
25cb0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
25cc0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
25cd0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
25ce0 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
25cf0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
25d00 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
25d10 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
25d20 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
25d30 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
25d40 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
25d50 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
25d60 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
25d70 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
25d80 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
25d90 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
25da0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
25db0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
25dc0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
25dd0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
25de0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
25df0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
25e00 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
25e10 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
25e20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
25e30 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
25e40 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
25e50 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
25e60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25e70 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
25e80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25e90 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
25ea0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
25eb0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
25ec0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
25ed0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
25ee0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
25ef0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
25f00 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
25f10 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
25f20 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
25f30 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
25f40 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25f50 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
25f60 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
25f70 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
25f80 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
25f90 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
25fa0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
25fb0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
25fc0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
25fd0 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
25fe0 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
25ff0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
26000 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
26010 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
26020 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26030 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
26040 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26050 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26060 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26070 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26080 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
26090 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
260a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
260b0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
260c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
260d0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
260e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
260f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26100 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
26110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26120 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
26130 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26140 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26150 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26160 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26170 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26180 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26190 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
261a0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
261b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
261c0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
261d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
261e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
261f0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
26200 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26210 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26230 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26240 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26250 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26270 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
26280 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
26290 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a  t isNot;      /*
262a0 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
262b0 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
262c0 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
262d0 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45  ;     /* IS TRUE
262e0 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
262f0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
26300 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26310 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20   );.      isNot 
26320 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
26330 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73  _ISNOT;.      is
26340 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
26350 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
26360 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
26370 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54     testcase( isT
26380 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26390 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
263a0 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74  !isTrue && isNot
263b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
263c0 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a  True ^ isNot ){.
263d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
263e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
263f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26400 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dest,.          
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
26430 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
26440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26460 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26470 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26480 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
264a0 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55  sNot ? SQLITE_JU
264b0 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20  MPIFNULL : 0);. 
264c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
264d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
264e0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
264f0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
26500 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26510 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
26520 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26530 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
26540 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
26550 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
26560 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
26570 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
26580 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
26590 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
265a0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
265b0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
265c0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
265d0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
265e0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
265f0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
26600 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
26610 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
26620 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
26630 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
26640 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26650 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26660 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
26670 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26680 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26690 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
266a0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
266b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
266c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
266d0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
266e0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
266f0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
26700 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
26710 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
26730 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
26740 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
26750 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
26760 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
26770 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
26780 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26790 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
267a0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
267b0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
267c0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
267d0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
267e0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
267f0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
26800 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26810 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
26820 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
26830 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26840 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
26850 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
26860 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
26870 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
26880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26890 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
268a0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
268b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
268c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
268d0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
268e0 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
268f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
26900 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
26910 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
26920 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
26930 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
26940 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
26950 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26960 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
26970 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26980 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26990 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
269a0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
269b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
269c0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
269d0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
269e0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
269f0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
26a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
26a10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
26a20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26a40 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
26a50 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
26a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
26a70 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
26a80 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
26a90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
26aa0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
26ab0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
26ac0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
26ad0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
26ae0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
26af0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
26b00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26b10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
26b20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26b40 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
26b50 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
26b60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26b70 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
26b80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26b90 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
26ba0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
26bb0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26bc0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26be0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
26bf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26c00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26c10 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
26c20 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
26c30 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
26c40 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75  e3ExprIfTrue, ju
26c50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
26c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26c80 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
26c90 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
26ca0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
26cb0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
26cc0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26cd0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
26ce0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
26cf0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
26d00 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
26d10 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
26d20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
26d30 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
26d40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
26d50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
26d60 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
26d70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26d80 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
26d90 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
26da0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
26db0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
26dc0 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
26dd0 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
26de0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26df0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e00 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
26e10 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
26e20 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
26e30 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
26e40 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
26e50 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
26e60 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
26e70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26e80 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
26e90 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26eb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
26ec0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
26ed0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
26ee0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
26ef0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
26f00 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26f10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
26f20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26f30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
26f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26f50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
26f60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26f70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
26f80 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
26f90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26fa0 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
26fb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26fc0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
26fd0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
26fe0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
26ff0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
27000 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
27010 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27020 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
27030 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
27040 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
27050 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
27060 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
27070 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
27080 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
27090 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
270a0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
270b0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
270c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
270d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
270e0 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
270f0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
27100 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
27110 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27120 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
27130 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27140 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27150 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
27160 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
27170 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
27180 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27190 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
271a0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
271b0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
271c0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
271d0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
271e0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
271f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27200 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
27210 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
27220 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
27230 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
27240 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
27250 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
27260 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
27270 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
27280 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
27290 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
272a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
272b0 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
272c0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
272d0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
272e0 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
272f0 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
27300 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
27310 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
27320 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
27330 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
27340 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
27350 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
27360 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
27370 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
27380 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
27390 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
273a0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
273b0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
273c0 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
273d0 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
273e0 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
273f0 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
27400 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
27410 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
27420 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
27430 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
27440 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
27450 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27460 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27470 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27480 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27490 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
274a0 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
274b0 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
274c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
274d0 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
274e0 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
274f0 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
27500 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
27510 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
27520 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
27530 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
27540 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
27550 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27560 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27570 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27580 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27590 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
275a0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
275b0 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
275c0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
275d0 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
275e0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
275f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27600 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
27610 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
27620 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27630 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
27640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27650 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
27660 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
27670 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27680 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
27690 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
276a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
276b0 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
276c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
276d0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
276e0 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
276f0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
27700 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
27710 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
27720 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27730 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27740 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27750 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27760 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27770 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27780 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27790 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
277a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
277b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
277c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
277d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
277e0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
277f0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
27800 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
27810 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27820 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27830 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27840 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
27850 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
27860 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
27870 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
27880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27890 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
278a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
278b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
278c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
278d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
278e0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
278f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27900 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
27910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27920 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27930 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27940 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27950 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
27960 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
27990 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
279a0 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
279b0 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
279c0 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
279d0 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
279e0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
279f0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
27a00 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27a10 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27a20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
27a30 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
27a40 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
27a50 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
27a60 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
27a70 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
27a80 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
27a90 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27aa0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
27ab0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
27ac0 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
27ad0 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
27ae0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
27af0 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
27b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27b10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27b20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27b30 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
27b60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27b70 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
27b80 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
27b90 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
27ba0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
27bb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27bc0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27bd0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
27c00 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
27c10 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
27c20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27c30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
27c40 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
27c50 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
27c60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
27c70 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
27c80 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27c90 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
27ca0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
27cb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
27cc0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
27cd0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
27ce0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
27cf0 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
27d00 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
27d10 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
27d20 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
27d30 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
27d40 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
27d50 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
27d60 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
27d70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
27d80 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
27d90 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
27da0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
27db0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27dc0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27dd0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
27de0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
27df0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27e00 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
27e10 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
27e20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27e30 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27e40 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
27e50 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
27e60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27e70 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
27e80 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
27e90 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
27ea0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
27eb0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
27ec0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
27ed0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27ee0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
27ef0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
27f00 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
27f10 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
27f20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27f30 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
27f40 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
27f50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27f60 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
27f70 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
27f80 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
27f90 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
27fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27fb0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
27fc0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
27fd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27fe0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
27ff0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
28000 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
28010 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
28020 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28030 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28040 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
28050 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28060 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28070 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28080 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
28090 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
280a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
280b0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
280c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
280d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
280e0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
280f0 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28100 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28110 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28120 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28130 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
28140 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28150 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
28160 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
28170 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28180 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
28190 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
281a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
281b0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
281c0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
281d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
281e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
281f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28200 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
28210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
28230 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
28240 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28250 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
28260 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28270 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
28280 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28290 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
282a0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
282b0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
282c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
282d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
282e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
282f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28300 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
28310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28320 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28330 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
28340 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28350 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28360 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28370 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
283a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
283b0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
283c0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
283d0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
283e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
283f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28400 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
28410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28420 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
28430 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28440 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
28450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28460 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28470 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
28480 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28490 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
284a0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
284b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
284c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
284d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
284e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
284f0 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
28500 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
28510 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
28520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28530 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
28540 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28550 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
28560 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28570 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
28580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28590 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
285a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
285b0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
285c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
285d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
285e0 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
285f0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
28600 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
28610 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
28620 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28630 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28640 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28650 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28660 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
28670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28680 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
28690 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
286a0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
286b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
286c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
286d0 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
286e0 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
286f0 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
28700 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
28710 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
28720 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
28730 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
28740 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
28750 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
28760 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
28770 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
28780 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
28790 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
287a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
287b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
287c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
287d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
287e0 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
287f0 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
28800 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
28810 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
28820 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
28830 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
28840 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
28850 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
28860 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28870 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
28880 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
28890 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
288a0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
288b0 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
288c0 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
288d0 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
288e0 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
288f0 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
28900 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
28910 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
28920 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
28930 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
28940 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
28950 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
28960 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
28970 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
28980 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
28990 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
289a0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
289b0 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
289c0 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
289d0 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
289e0 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
289f0 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
28a00 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
28a10 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
28a20 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
28a30 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
28a40 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
28a50 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
28a60 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
28a70 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
28a80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
28a90 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
28aa0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
28ab0 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
28ac0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
28ad0 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
28ae0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
28af0 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
28b00 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
28b10 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
28b20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
28b30 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
28b40 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
28b50 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
28b60 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
28b70 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
28b80 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
28b90 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
28ba0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
28bb0 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
28bc0 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
28bd0 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
28be0 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
28bf0 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
28c00 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
28c10 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
28c20 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
28c30 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
28c40 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
28c50 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
28c60 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
28c70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
28c80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
28c90 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
28ca0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28cb0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
28cc0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
28cd0 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
28ce0 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
28cf0 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
28d00 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
28d10 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
28d20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28d30 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
28d40 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
28d50 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
28d60 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
28d70 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
28d80 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
28d90 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
28da0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
28db0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
28dc0 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
28dd0 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
28de0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
28df0 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
28e00 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
28e10 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
28e20 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
28e30 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
28e40 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
28e50 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
28e60 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
28e70 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
28e80 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
28e90 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
28ea0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
28eb0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
28ec0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
28ed0 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
28ee0 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
28ef0 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
28f00 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
28f10 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
28f20 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
28f30 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
28f40 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
28f50 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
28f60 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
28f70 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
28f80 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
28f90 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
28fa0 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
28fb0 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
28fc0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
28fd0 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
28fe0 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
28ff0 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
29000 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
29010 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
29020 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
29030 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
29040 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
29050 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
29060 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29070 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
29080 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
29090 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
290a0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
290b0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
290c0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
290d0 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
290e0 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
290f0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
29100 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
29110 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
29120 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
29130 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
29140 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
29150 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
29160 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
29170 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
29180 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
29190 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
291a0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
291b0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
291c0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
291d0 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
291e0 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
291f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
29200 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
29210 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
29220 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
29230 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
29240 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
29250 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
29260 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
29270 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
29280 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
29290 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
292a0 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
292b0 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
292c0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
292d0 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
292e0 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
292f0 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
29300 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
29310 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
29320 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
29330 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
29340 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
29350 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
29360 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
29370 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
29380 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29390 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
293a0 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
293b0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
293c0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
293d0 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
293e0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
293f0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
29400 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
29410 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
29420 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
29430 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
29440 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
29450 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
29460 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29470 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
29480 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
29490 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
294a0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
294b0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
294c0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
294d0 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
294e0 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
294f0 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
29500 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
29510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
29520 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
29530 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
29540 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
29550 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
29560 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29570 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29580 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
29590 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
295a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
295b0 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
295c0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
295d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
295e0 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
295f0 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
29600 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29610 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
29620 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
29630 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
29640 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
29650 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
29660 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
29670 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
29680 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
29690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
296a0 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
296b0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
296c0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
296d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
296e0 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
296f0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  E ){.      if( s
29700 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
29710 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29720 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29730 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
29740 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
29750 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
29760 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
29770 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
29780 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
29790 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
297a0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
297b0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
297c0 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
297d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
297e0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
297f0 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
29800 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 65  ){.    if( pA->e
29810 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 7c 7c 20  X==EX_Select || 
29820 70 41 2d 3e 65 58 21 3d 70 42 2d 3e 65 58 20 29  pA->eX!=pB->eX )
29830 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
29840 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
29850 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
29860 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
29870 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
29880 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
29890 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
298a0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
298b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
298c0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
298d0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
298e0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
298f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
29900 69 66 28 20 70 41 2d 3e 65 58 3d 3d 45 58 5f 4c  if( pA->eX==EX_L
29910 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ist ){.      if(
29920 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
29930 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
29940 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
29950 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
29960 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   2;.    }.    as
29970 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46  sert( (combinedF
29980 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
29990 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  d)==0 );.    if(
299a0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
299b0 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  NG && pA->op!=TK
299c0 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20  _TRUEFALSE ){.  
299d0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
299e0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
299f0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29a00 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
29a10 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
29a20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
29a30 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
29a40 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
29a50 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
29a60 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
29a70 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
29a80 46 55 4e 43 0a 20 20 20 20 2f 2a 20 4a 75 73 74  FUNC.    /* Just
29a90 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68  ification for th
29aa0 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20  e assert():.    
29ab0 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ** window functi
29ac0 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d  ons have p->op==
29ad0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20  TK_FUNCTION but 
29ae0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
29af0 6f 6e 73 0a 20 20 20 20 2a 2a 20 68 61 76 65 20  ons.    ** have 
29b00 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  p->op==TK_AGG_FU
29b10 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20  NCTION.  So any 
29b20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
29b30 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  en an aggregate.
29b40 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
29b50 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  and a window fun
29b60 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76  ction should hav
29b70 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20  e failed before 
29b80 72 65 61 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20  reaching.    ** 
29b90 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64  this point.  And
29ba0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
29bb0 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77  ible to have a w
29bc0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
29bd0 6e 64 0a 20 20 20 20 2a 2a 20 61 20 73 63 61 6c  nd.    ** a scal
29be0 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ar function with
29bf0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
29c00 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  nd number of arg
29c10 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20  uments.  So.    
29c20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68 20 74  ** if we reach t
29c30 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68 65  his point, eithe
29c40 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20 77  r A and B both w
29c50 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
29c60 6f 72 0a 20 20 20 20 2a 2a 20 6e 65 69 74 68 65  or.    ** neithe
29c70 72 20 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66  r are a window f
29c80 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  unctions. */.   
29c90 20 61 73 73 65 72 74 28 20 28 70 41 2d 3e 70 57   assert( (pA->pW
29ca0 69 6e 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70 57 69  in==0)==(pB->pWi
29cb0 6e 3d 3d 30 29 20 29 3b 0a 0a 20 20 20 20 69 66  n==0) );..    if
29cc0 28 20 70 41 2d 3e 70 57 69 6e 21 3d 30 20 29 7b  ( pA->pWin!=0 ){
29cd0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29ce0 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
29cf0 70 50 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e 2c  pParse,pA->pWin,
29d00 70 42 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20 72  pB->pWin)!=0 ) r
29d10 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23  eturn 2;.    }.#
29d20 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
29d30 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
29d40 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
29d50 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
29d60 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
29d70 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
29d80 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
29d90 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
29da0 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
29db0 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29dc0 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29dd0 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29de0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
29df0 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
29e00 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
29e10 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
29e20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
29e30 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
29e40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
29e50 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
29e60 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
29e70 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
29e80 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
29e90 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
29ea0 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
29eb0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
29ec0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
29ed0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
29ee0 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
29ef0 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
29f00 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
29f10 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
29f20 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
29f30 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
29f40 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
29f50 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
29f60 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
29f70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
29f80 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
29f90 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
29fa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29fb0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
29fc0 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
29fd0 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
29fe0 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
29ff0 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
2a000 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
2a010 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
2a020 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
2a030 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
2a040 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
2a050 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
2a060 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
2a070 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
2a080 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
2a090 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
2a0a0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
2a0b0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2a0c0 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
2a0d0 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
2a0e0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2a0f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
2a100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a110 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45  re(0, pExprA, pE
2a120 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
2a130 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a140 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a150 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
2a160 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70  rCompare() excep
2a170 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  t COLLATE operat
2a180 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c  ors at the top-l
2a190 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f  evel.** are igno
2a1a0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2a1b0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b  te3ExprCompareSk
2a1c0 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  ip(Expr *pA, Exp
2a1d0 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
2a1e0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2a1f0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2a200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2a210 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2a220 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20  late(pA),.      
2a230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a240 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42  prSkipCollate(pB
2a250 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a260 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
2a270 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
2a280 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
2a290 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
2a2a0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
2a2b0 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
2a2c0 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
2a2d0 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
2a2e0 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
2a2f0 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
2a300 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
2a310 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
2a320 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
2a330 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2a340 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2a350 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
2a360 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2a370 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2a380 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
2a390 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
2a3a0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
2a3b0 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
2a3c0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2a3d0 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
2a3e0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2a3f0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2a400 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
2a410 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2a420 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2a430 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2a440 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
2a450 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2a460 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
2a470 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
2a480 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
2a490 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2a4a0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
2a4b0 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
2a4c0 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
2a4d0 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
2a4e0 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
2a4f0 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
2a500 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
2a510 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
2a520 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
2a530 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a540 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2a550 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
2a560 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  nd variables in 
2a570 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70  pE1 are .** comp
2a580 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74  ared against lit
2a590 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70  eral values in p
2a5a0 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70  E2 and pParse->p
2a5b0 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73  Vdbe->expmask is
2a5c0 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20  .** modified to 
2a5d0 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75  record which bou
2a5e0 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  nd variables are
2a5f0 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66   referenced.  If
2a600 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e   pParse .** is N
2a610 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20  ULL, then false 
2a620 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a630 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73   if pE1 contains
2a640 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61   any bound varia
2a650 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
2a660 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
2a670 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
2a680 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
2a690 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
2a6a0 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
2a6b0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
2a6c0 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
2a6d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
2a6e0 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
2a6f0 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
2a700 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
2a710 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
2a720 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
2a730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a740 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61  prImpliesExpr(Pa
2a750 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2a760 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
2a770 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
2a780 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a790 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a7a0 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
2a7b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a7c0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2a7d0 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
2a7e0 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
2a7f0 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2a800 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  , pE1, pE2->pLef
2a810 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
2a820 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2a830 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2a840 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2a850 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a860 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2a870 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2a880 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
2a890 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2a8a0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
2a8b0 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
2a8c0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
2a8d0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2a8e0 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
2a8f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2a900 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
2a910 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a920 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a930 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65  se, pX, pE2->pLe
2a940 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
2a950 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2a960 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2a970 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78  * This is the Ex
2a980 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  pr node callback
2a990 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
2a9a0 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  ImpliesNotNullRo
2a9b0 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  w()..** If the e
2a9c0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
2a9d0 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
2a9e0 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65   table at pWalke
2a9f0 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20  r->iCur.** have 
2aa00 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d  a non-NULL colum
2aa10 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c  n, then set pWal
2aa20 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20  ker->eCode to 1 
2aa30 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74  and abort..*/.st
2aa40 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73  atic int implies
2aa50 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65  NotNullRow(Walke
2aa60 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2aa70 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
2aa80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2aa90 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57  nly called for W
2aaa0 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
2aab0 65 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69  essions and so i
2aac0 74 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61  t.  ** cannot ha
2aad0 76 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f  ve any TK_AGG_CO
2aae0 4c 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63  LUMN entries bec
2aaf0 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f  ause those are o
2ab00 6e 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69  nly found.  ** i
2ab10 6e 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  n HAVING clauses
2ab20 2e 20 20 57 65 20 63 61 6e 20 67 65 74 20 61 20  .  We can get a 
2ab30 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2ab40 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
2ab50 65 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  e,.  ** but that
2ab60 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63   is an illegal c
2ab70 6f 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68 65  onstruct and the
2ab80 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72   query will be r
2ab90 65 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20  ejected at.  ** 
2aba0 61 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66  a later stage of
2abb0 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20   processing, so 
2abc0 74 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  the TK_AGG_FUNCT
2abd0 49 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  ION case does no
2abe0 74 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62  t.  ** need to b
2abf0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72  e considered her
2ac00 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2ac10 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
2ac20 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65  G_COLUMN );.  te
2ac30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ac40 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2ac50 4f 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70  ON );..  if( Exp
2ac60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2ac70 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2ac80 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72   ) return WRC_Pr
2ac90 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  une;.  switch( p
2aca0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2acb0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
2acc0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a     case TK_NOT:.
2acd0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
2ace0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2acf0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
2ad00 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
2ad10 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54  CASE:.    case T
2ad20 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IN:.    case T
2ad30 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
2ad40 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2ad50 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
2ad60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2ad70 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2ad80 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _NOT );.      te
2ad90 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ada0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
2adb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2adc0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2add0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ade0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2adf0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  K_OR );.      te
2ae00 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ae10 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20  p==TK_CASE );.  
2ae20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2ae30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
2ae40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2ae50 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2ae60 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
2ae70 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2ae80 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ne;.    case TK_
2ae90 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66  COLUMN:.      if
2aea0 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75  ( pWalker->u.iCu
2aeb0 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
2aec0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c   ){.        pWal
2aed0 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2aee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2aef0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2af00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2af10 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f  RC_Prune;..    /
2af20 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * Virtual tables
2af30 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
2af40 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
2af50 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f  like x=NULL.  So
2af60 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f  .    ** a term o
2af70 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64  f the form x=y d
2af80 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68  oes not prove th
2af90 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  at y is not null
2afa0 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20   if x.    ** is 
2afb0 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  the column of a 
2afc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
2afd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
2afe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
2aff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
2b000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
2b010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
2b020 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
2b030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b040 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2b050 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
2b060 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b070 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
2b080 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b090 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
2b0a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b0b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  pr->op==TK_LE );
2b0c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b0d0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2b0e0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b0f0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b100 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69  TK_GE );.      i
2b110 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  f( (pExpr->pLeft
2b120 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2b130 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78  && IsVirtual(pEx
2b140 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29  pr->pLeft->pTab)
2b150 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  ).       || (pEx
2b160 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pr->pRight->op==
2b170 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2b180 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52  irtual(pExpr->pR
2b190 69 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20  ight->pTab)).   
2b1a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74     ){.       ret
2b1b0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b1c0 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75       }.    defau
2b1d0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
2b1e0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2b1f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
2b200 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
2b210 6f 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  o) if expression
2b220 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74   p can only be t
2b230 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a  rue if at least.
2b240 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ** one column of
2b250 20 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e   table iTab is n
2b260 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68  on-null.  In oth
2b270 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
2b280 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72   true.** if expr
2b290 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c  ession p will al
2b2a0 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ways be NULL or 
2b2b0 66 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63  false if every c
2b2c0 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a  olumn of iTab.**
2b2d0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
2b2e0 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20  False negatives 
2b2f0 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20  are acceptable. 
2b300 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2b310 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74   it is ok to ret
2b320 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e  urn.** zero even
2b330 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2b340 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74   will never be t
2b350 72 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c  rue of every col
2b360 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69  umn of iTab.** i
2b370 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65  s NULL.  A false
2b380 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72   negative is mer
2b390 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74  ely a missed opt
2b3a0 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74  imization opport
2b3b0 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c  unity..**.** Fal
2b3c0 73 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65  se positives are
2b3d0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f   not allowed, ho
2b3e0 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20  wever.  A false 
2b3f0 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73  positive may res
2b400 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63  ult.** in an inc
2b410 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a  orrect answer..*
2b420 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20  *.** Terms of p 
2b430 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20  that are marked 
2b440 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  with EP_FromJoin
2b450 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74   (and hence that
2b460 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68   come from.** th
2b470 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2b480 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f  auses of LEFT JO
2b490 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65  INS) are exclude
2b4a0 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79  d from the analy
2b4b0 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sis..**.** This 
2b4c0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2b4d0 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45  to check if a LE
2b4e0 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63  FT JOIN can be c
2b4f0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a  onverted into.**
2b500 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49   an ordinary JOI
2b510 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65  N.  The p argume
2b520 6e 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20  nt is the WHERE 
2b530 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
2b540 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
2b550 72 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f  requires that so
2b560 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  me column of the
2b570 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
2b580 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a  the LEFT JOIN.**
2b590 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   be non-NULL, th
2b5a0 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  en the LEFT JOIN
2b5b0 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
2b5c0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
2b5d0 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69  .** ordinary joi
2b5e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2b5f0 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
2b600 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20  ullRow(Expr *p, 
2b610 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c  int iTab){.  Wal
2b620 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2b630 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69  Callback = impli
2b640 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20  esNotNullRow;.  
2b650 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2b660 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65  k = 0;.  w.xSele
2b670 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2b680 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  .  w.eCode = 0;.
2b690 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61    w.u.iCur = iTa
2b6a0 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  b;.  sqlite3Walk
2b6b0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
2b6c0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
2b6d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2b6e0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2b6f0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2b700 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2b710 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2b720 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2b730 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2b740 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2b750 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2b760 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2b770 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2b780 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2b790 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2b7a0 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2b7b0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2b7c0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2b7d0 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2b7e0 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2b7f0 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2b800 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2b810 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2b820 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2b830 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2b840 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2b850 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2b860 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2b870 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2b880 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2b890 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2b8a0 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2b8b0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2b8c0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2b8d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2b8e0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2b8f0 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2b900 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2b910 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2b920 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2b930 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2b940 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2b950 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2b960 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2b970 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2b980 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2b990 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2b9a0 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2b9b0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2b9c0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2b9d0 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2b9e0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2b9f0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2ba00 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2ba10 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2ba20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2ba30 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2ba40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2ba50 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2ba60 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2ba70 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2ba80 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2ba90 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2baa0 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2bab0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2bac0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2bad0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2bae0 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2baf0 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2bb00 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2bb10 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2bb20 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2bb30 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2bb40 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2bb50 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2bb60 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2bb70 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2bb80 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2bb90 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2bba0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2bbb0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2bbc0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2bbd0 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2bbe0 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2bbf0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2bc00 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2bc10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2bc20 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2bc30 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2bc40 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2bc50 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2bc60 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2bc70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2bc80 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2bc90 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2bca0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2bcb0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2bcc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2bcd0 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2bce0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2bcf0 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2bd00 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2bd10 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2bd20 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2bd30 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2bd40 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2bd50 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2bd60 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2bd70 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2bd80 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2bd90 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2bda0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2bdb0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2bdc0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2bdd0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2bde0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2bdf0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2be00 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2be10 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2be20 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2be30 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2be40 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2be50 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2be60 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2be70 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2be80 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2be90 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2bea0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2beb0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2bec0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2bed0 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2bee0 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2bef0 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2bf00 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2bf10 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2bf20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2bf30 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2bf40 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2bf50 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2bf60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2bf70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2bf80 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2bf90 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2bfa0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2bfb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2bfc0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2bfd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bfe0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2bff0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2c000 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2c010 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2c020 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2c030 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2c040 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2c050 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2c060 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2c070 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2c080 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2c090 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2c0a0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2c0b0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2c0c0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2c0d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2c0e0 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2c0f0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2c100 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2c110 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2c120 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2c130 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2c140 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2c150 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2c160 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2c170 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2c180 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2c190 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2c1a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2c1b0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2c1c0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2c1d0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2c1e0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2c1f0 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2c200 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2c210 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2c220 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2c230 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2c240 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2c250 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2c260 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2c270 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2c280 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2c290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2c2a0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2c2b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2c2c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2c2d0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2c2e0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2c2f0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2c300 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2c310 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2c320 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2c330 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2c340 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2c350 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2c360 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2c370 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2c380 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2c390 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2c3a0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2c3b0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2c3c0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2c3d0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2c3e0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2c3f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2c400 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2c410 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2c420 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2c430 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2c440 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2c450 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2c460 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2c470 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2c480 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2c490 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2c4a0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c4b0 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2c4c0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2c4d0 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2c4e0 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2c4f0 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2c500 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2c510 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2c520 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2c530 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2c540 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2c550 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2c560 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2c570 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2c580 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2c590 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2c5a0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2c5b0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2c5c0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2c5d0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2c5e0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2c5f0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2c600 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2c610 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2c620 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2c630 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2c640 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2c650 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2c660 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2c670 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2c680 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2c690 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2c6a0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2c6b0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2c6c0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2c6d0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2c6e0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2c6f0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2c700 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2c710 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2c720 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2c730 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2c740 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2c750 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2c760 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2c770 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2c780 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2c790 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2c7a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2c7b0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2c7c0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2c7d0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2c7e0 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2c7f0 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2c800 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2c810 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2c820 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2c830 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2c840 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2c850 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2c860 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2c870 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2c880 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2c890 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2c8a0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c8c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2c8d0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2c8e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2c8f0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2c900 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2c910 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2c920 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2c930 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2c940 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2c950 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2c960 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2c970 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2c980 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2c990 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2c9a0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2c9b0 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67   = pNC->uNC.pAgg
2c9c0 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  Info;..  assert(
2c9d0 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2c9e0 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20  NC_UAggInfo );. 
2c9f0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2ca00 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2ca10 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
2ca20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2ca30 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
2ca40 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ca50 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
2ca60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ca70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2ca80 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
2ca90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2caa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
2cab0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
2cac0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2cad0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
2cae0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2caf0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
2cb00 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
2cb10 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
2cb20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2cb30 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2cb40 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
2cb50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2cb60 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2cb70 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2cb80 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2cb90 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2cba0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
2cbb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2cbc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2cbd0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2cbe0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2cbf0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2cc00 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2cc10 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
2cc20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
2cc30 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
2cc40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
2cc50 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
2cc60 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2cc70 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
2cc80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2cc90 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2cca0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
2ccb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2ccc0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
2ccd0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
2cce0 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
2ccf0 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
2cd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2cd10 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
2cd20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2cd30 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2cd40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
2cd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2cd60 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
2cd70 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2cd80 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
2cd90 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
2cda0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2cdb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2cdc0 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
2cdd0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cdf0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
2ce00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2ce30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ce40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ce50 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
2ce60 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
2ce70 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
2ce80 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2ce90 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
2cea0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
2ceb0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2cec0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2ced0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
2cee0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
2cef0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2cf00 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
2cf10 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2cf20 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
2cf30 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
2cf40 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
2cf50 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
2cf60 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
2cf70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
2cf80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2cf90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cfa0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2cfb0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2cfc0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
2cfd0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2cfe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2cff0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2d000 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2d010 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2d030 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
2d040 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
2d050 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2d060 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2d070 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
2d080 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
2d090 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
2d0a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2d0b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2d0c0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
2d0d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2d0e0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2d0f0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2d100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d110 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2d120 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
2d130 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2d140 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d160 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
2d170 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d190 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2d1a0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2d1c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2d1d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d1e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d1f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2d210 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d220 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2d230 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2d240 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
2d250 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
2d260 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
2d270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d290 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2d2a0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
2d2b0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
2d2c0 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
2d2d0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
2d2e0 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
2d2f0 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
2d300 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
2d310 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
2d320 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
2d330 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
2d340 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
2d350 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
2d360 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
2d370 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
2d380 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
2d390 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d3a0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2d3b0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2d3c0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2d3e0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2d3f0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2d400 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2d410 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
2d420 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2d430 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
2d440 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2d450 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
2d460 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
2d470 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
2d480 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
2d490 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
2d4a0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
2d4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2d4c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2d4d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2d4e0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
2d4f0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
2d500 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2d510 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
2d520 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
2d530 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
2d540 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
2d550 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2d560 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
2d570 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
2d580 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
2d590 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
2d5a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
2d5b0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2d5c0 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
2d5d0 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
2d5e0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2d5f0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
2d600 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
2d610 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
2d620 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2d630 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2d640 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2d650 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2d660 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49  xprCompare(0, pI
2d670 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
2d680 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
2d690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d6a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d6c0 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
2d6d0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
2d6e0 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
2d6f0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
2d700 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
2d710 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
2d720 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d730 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
2d740 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
2d750 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
2d760 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
2d770 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2d780 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2d790 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
2d7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2d7b0 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74  xpr->eX==EX_List
2d7c0 20 7c 7c 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45   || pExpr->eX==E
2d7d0 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  X_None );.      
2d7e0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2d7f0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2d800 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
2d810 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
2d820 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2d830 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
2d840 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d850 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2d860 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2d870 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
2d880 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2d890 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
2d8a0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
2d8b0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
2d8c0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2d8d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d8e0 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2d900 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74  xpr->eX==EX_List
2d910 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
2d920 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
2d930 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
2d940 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
2d950 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2d960 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2d970 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2d980 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2d990 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
2d9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d9b0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2d9c0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2d9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d9f0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
2da00 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
2da10 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2da20 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2da30 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
2da40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2da50 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2da60 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2da70 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2da80 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2da90 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2daa0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2dab0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2dac0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2dad0 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
2dae0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2daf0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2db00 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2db10 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
2db20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2db30 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2db40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2db50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2db60 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2db70 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2db80 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
2db90 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2dba0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dbb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2dbc0 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2dbd0 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2dbe0 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  epth++;.  return
2dbf0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2dc00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2dc10 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2dc20 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72  SelectEnd(Walker
2dc30 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2dc40 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2dc50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2dc60 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2dc70 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2dc80 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  --;.}../*.** Ana
2dc90 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2dca0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2dcb0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2dcc0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2dcd0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2dce0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2dcf0 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2dd00 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2dd10 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2dd20 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2dd30 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2dd40 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2dd50 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2dd60 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2dd70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2dd80 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2dd90 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2dda0 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2ddb0 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2ddc0 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2ddd0 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2dde0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2ddf0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2de00 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2de10 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2de20 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2de30 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2de40 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2de50 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2de60 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2de70 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2de80 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ect;.  w.xSelect
2de90 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c  Callback2 = anal
2dea0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2deb0 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61  electEnd;.  w.wa
2dec0 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
2ded0 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
2dee0 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
2def0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
2df00 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2df10 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
2df20 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2df30 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2df40 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
2df50 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
2df60 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
2df70 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
2df80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2df90 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
2dfa0 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
2dfb0 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
2dfc0 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
2dfd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2dfe0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
2dff0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2e000 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2e010 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
2e020 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2e030 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
2e040 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2e050 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
2e060 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
2e070 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
2e080 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
2e090 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e0a0 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
2e0b0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2e0c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2e0d0 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
2e0e0 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
2e0f0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
2e100 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
2e110 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
2e120 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2e130 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
2e140 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2e150 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
2e160 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
2e170 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
2e180 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
2e190 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
2e1a0 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
2e1b0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2e1c0 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
2e1d0 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
2e1e0 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
2e1f0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
2e200 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2e210 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2e220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e230 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
2e240 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
2e250 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
2e260 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
2e270 70 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61  pReg) ){.    pPa
2e280 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
2e290 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
2e2a0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
2e2b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2e2c0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
2e2d0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
2e2e0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
2e2f0 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
2e300 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2e310 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2e320 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
2e330 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  i, n;.  if( nReg
2e340 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ==1 ) return sql
2e350 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2e360 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50  Parse);.  i = pP
2e370 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
2e380 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
2e390 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
2e3a0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70  nReg<=n ){.    p
2e3b0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2e3c0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2e3d0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2e3e0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2e3f0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2e400 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2e410 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2e420 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2e430 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2e440 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2e450 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2e460 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2e470 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65  nReg){.  if( nRe
2e480 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==1 ){.    sqli
2e490 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2e4a0 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b  g(pParse, iReg);
2e4b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2e4c0 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
2e4d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
2e4e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2e4f0 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
2e500 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2e510 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
2e520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2e530 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
2e540 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
2e550 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
2e560 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
2e570 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2e580 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
2e590 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
2e5a0 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
2e5b0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2e5c0 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
2e5d0 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20  * Validate that 
2e5e0 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  no temporary reg
2e5f0 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68  ister falls with
2e600 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  in the range of.
2e610 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ** iFirst..iLast
2e620 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68  , inclusive.  Th
2e630 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2e640 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74  ly call from wit
2e650 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  hin assert().** 
2e660 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
2e670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e680 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  UG.int sqlite3No
2e690 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72  TempsInRange(Par
2e6a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2e6b0 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73  iFirst, int iLas
2e6c0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
2e6d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  f( pParse->nRang
2e6e0 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61  eReg>0.   && pPa
2e6f0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70  rse->iRangeReg+p
2e700 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2e710 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20   > iFirst.   && 
2e720 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2e730 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a  g <= iLast.  ){.
2e740 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2e750 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2e760 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e770 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2e780 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2e790 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2e7a0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2e7b0 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2e7c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2e7d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e7e0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2e7f0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.