/ Hex Artifact Content
Login

Artifact cc72d25fe9c2f3d6e8bdf9d519ab20135a45a8ade37c7712155af5d88693092e:


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: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
1550: 70 2d 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45  p->flags holds E
1560: 50 5f 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d  P_Collate and p-
1570: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f  >pLeft->flags do
1580: 65 73 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20  es not.  And.   
1590: 20 20 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65       ** p->x.pSe
15a0: 6c 65 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f  lect cannot.  So
15b0: 20 69 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65   if p->x.pLeft e
15c0: 78 69 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68  xists, it must h
15d0: 6f 6c 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a  old at.        *
15e0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43  * least one EP_C
15f0: 6f 6c 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65  ollate. Thus the
1600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41   following two A
1610: 4c 57 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20  LWAYS. */.      
1620: 20 20 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f    if( p->eX==EX_
1630: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1640: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1650: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1660: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1670: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1690: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
16b0: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
16c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
16d0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
16e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
16f0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1720: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1730: 20 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 52   if( p->eX==EX_R
1740: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
1750: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70    pNext = p->x.p
1760: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d  Right;.        }
1770: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65  .        p = pNe
1780: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
17a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
17b0: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
17c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
17d0: 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70  pColl) ){ .    p
17e0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
17f0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1800: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1810: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1820: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
1830: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
1840: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
1850: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
1860: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
1870: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1880: 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20   the.** defautl 
1890: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
18a0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ce..**.** See al
18b0: 73 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43  so: sqlite3ExprC
18c0: 6f 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54  ollSeq().**.** T
18d0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
18e0: 6c 6c 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20  llSeq() routine 
18f0: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65  works the same e
1900: 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
1910: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
1920: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
1930: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  ined collation..
1940: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1950: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1960: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1970: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1980: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c  CollSeq *p = sql
1990: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
19a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
19b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d    if( p==0 ) p =
19c0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
19d0: 6c 74 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  ltColl;.  assert
19e0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p!=0 );.  retu
19f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1a00: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1a10: 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
1a20: 73 20 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e  s have equivalen
1a30: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1a40: 65 6e 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ences..*/.int sq
1a50: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1a60: 4d 61 74 63 68 28 50 61 72 73 65 20 2a 70 50 61  Match(Parse *pPa
1a70: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20  rse, Expr *pE1, 
1a80: 45 78 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f  Expr *pE2){.  Co
1a90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20  llSeq *pColl1 = 
1aa0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
1ab0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 31  lSeq(pParse, pE1
1ac0: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
1ad0: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78  oll2 = sqlite3Ex
1ae0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
1af0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 72 65 74 75  se, pE2);.  retu
1b00: 72 6e 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  rn sqlite3StrICm
1b10: 70 28 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c  p(pColl1->zName,
1b20: 20 70 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d   pColl2->zName)=
1b30: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  =0;.}../*.** pEx
1b40: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
1b50: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1b60: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1b70: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1b80: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1b90: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1bb0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1bc0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1bd0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1be0: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1bf0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1c00: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1c10: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1c20: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1c30: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1c40: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1c50: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1c60: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
1c70: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1c80: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1c90: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1ca0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1cb0: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1cc0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1cd0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1ce0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1cf0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1d00: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1d10: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1d20: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1d30: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1d60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d80: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
1d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1da0: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1db0: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1dc0: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1dd0: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1de0: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1df0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
1e00: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
1e10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e20: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73  AFF_BLOB;.  }els
1e30: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
1e40: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
1e50: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1e60: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
1e70: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
1e80: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
1e90: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
1ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1eb0: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1ec0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1ed0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1ee0: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1ef0: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1f00: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
1f10: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
1f20: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
1f30: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
1f40: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
1f50: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1f60: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1f70: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1f80: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1f90: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1fa0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1fb0: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1fc0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1fd0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1fe0: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1ff0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
2000: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
2010: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
2050: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
2060: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
2070: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
2080: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
2090: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
20a0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65  ;.  if( pExpr->e
20b0: 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 7b 0a 20  X==EX_Right ){. 
20c0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
20d0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
20e0: 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c  pExpr->x.pRight,
20f0: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
2100: 66 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  f( pExpr->eX==EX
2110: 5f 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  _Select ){.    a
2120: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
2130: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2140: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
2150: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
2160: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
2170: 69 66 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20  if( aff==0 ){.  
2180: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
2190: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72  FF_BLOB;.  }.  r
21a0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
21b0: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
21c0: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
21d0: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
21e0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
21f0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
2200: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
2210: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
2220: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
2230: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
2240: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
2250: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
2260: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
2270: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
2280: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
2290: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
22a0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
22b0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
22c0: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
22d0: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
22e0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
22f0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
2300: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
2310: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
2320: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
2330: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
2340: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
2350: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
2360: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
2370: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
2380: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
2390: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
23a0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
23b0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
23c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23d0: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
23e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
23f0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
2400: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
2410: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
2420: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
2430: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
2440: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
2450: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
2460: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
2470: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
2480: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
2490: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
24a0: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
24b0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
24c0: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
24d0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
24e0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
24f0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
2500: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
2510: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
2520: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2530: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
2540: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
2550: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
2560: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
2570: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
2580: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
2590: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
25a0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
25b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
25c0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
25d0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
25e0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
25f0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
2600: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2610: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
2620: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
2630: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
2640: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
2650: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
2660: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
2670: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
2680: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
2690: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
26a0: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
26b0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
26c0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
26d0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
26e0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  red..**.** The s
26f0: 65 63 6f 6e 64 20 66 6f 72 6d 20 28 73 71 6c 69  econd form (sqli
2700: 74 65 33 42 69 6e 61 72 79 45 78 70 72 43 6f 6c  te3BinaryExprCol
2710: 6c 53 65 71 28 29 29 20 75 73 65 73 20 74 68 65  lSeq()) uses the
2720: 20 45 78 70 72 2e 70 4c 65 66 74 0a 2a 2a 20 61   Expr.pLeft.** a
2730: 6e 64 20 45 78 70 72 2e 78 2e 70 52 69 67 68 74  nd Expr.x.pRight
2740: 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
2750: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2760: 74 20 69 6e 73 74 65 61 64 20 6f 66 20 73 65 70  t instead of sep
2770: 61 72 61 74 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  arate.** pointer
2780: 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  s..*/.CollSeq *s
2790: 71 6c 69 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e  qlite3Comparison
27a0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
27b0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
27c0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
27d0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
27e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
27f0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2800: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2810: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2820: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2830: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2840: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2850: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2860: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2870: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2880: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
2890: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
28a0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
28b0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
28c0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
28d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28e0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
28f0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2900: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2910: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2920: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2930: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2950: 6c 3b 0a 7d 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  l;.}.CollSeq *sq
2960: 6c 69 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e 45  lite3ComparisonE
2970: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
2980: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2990: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
29a0: 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68  xpr->eX==EX_Righ
29b0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
29c0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 69 73 6f  sqlite3Compariso
29d0: 6e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  nCollSeq(pParse,
29e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
29f0: 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 29 3b  Expr->x.pRight);
2a00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2a10: 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 6d 70  turn sqlite3Comp
2a20: 61 72 69 73 6f 6e 43 6f 6c 6c 53 65 71 28 70 50  arisonCollSeq(pP
2a30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
2a40: 66 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ft, 0);.  }.}../
2a50: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2a60: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2a70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2a80: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2a90: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
2aa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
2ab0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
2ac0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
2ad0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
2ae0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
2af0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2b00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2b10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2b20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2b40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2b50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2b60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2b70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2b80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2b90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2ba0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2bb0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2bc0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2bd0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2be0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2bf0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2c00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2c10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2c20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2c30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 43  .  p4 = sqlite3C
2c40: 6f 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c 53 65 71  omparisonCollSeq
2c50: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
2c60: 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20  pRight);.  p5 = 
2c70: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
2c80: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a  pLeft, pRight, j
2c90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64  umpIfNull);.  ad
2ca0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2cb0: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
2cc0: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e  Vdbe, opcode, in
2cd0: 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20  2, dest, in1,.  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2d00: 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  p4, P4_COLLSEQ);
2d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2d20: 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70  angeP5(pParse->p
2d30: 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20  Vdbe, (u8)p5);. 
2d40: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2d50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2d60: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
2d70: 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
2d80: 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  or, or false oth
2d90: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  erwise..**.** A 
2da0: 76 65 63 74 6f 72 20 69 73 20 64 65 66 69 6e 65  vector is define
2db0: 64 20 61 73 20 61 6e 79 20 65 78 70 72 65 73 73  d as any express
2dc0: 69 6f 6e 20 74 68 61 74 20 72 65 73 75 6c 74 73  ion that results
2dd0: 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   in two or more.
2de0: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65  ** columns of re
2df0: 73 75 6c 74 2e 20 20 45 76 65 72 79 20 54 4b 5f  sult.  Every TK_
2e00: 56 45 43 54 4f 52 20 6e 6f 64 65 20 69 73 20 61  VECTOR node is a
2e10: 6e 20 76 65 63 74 6f 72 20 62 65 63 61 75 73 65  n vector because
2e20: 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 77   the.** parser w
2e30: 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  ill not generate
2e40: 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 77 69 74   a TK_VECTOR wit
2e50: 68 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f  h fewer than two
2e60: 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74   entries..** But
2e70: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67   a TK_SELECT mig
2e80: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 76  ht be either a v
2e90: 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
2ea0: 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  r. It is only.**
2eb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 65   considered a ve
2ec0: 63 74 6f 72 20 69 66 20 69 74 20 68 61 73 20 74  ctor if it has t
2ed0: 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c  wo or more resul
2ee0: 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e  t columns..*/.in
2ef0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  t sqlite3ExprIsV
2f00: 65 63 74 6f 72 28 45 78 70 72 20 2a 70 45 78 70  ector(Expr *pExp
2f10: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2f20: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2f30: 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a  ze(pExpr)>1;.}..
2f40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2f50: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2f60: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2f70: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2f80: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2f90: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2fa0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
2fb0: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
2fc0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
2fd0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
2fe0: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
2ff0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3000: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
3010: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
3020: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
3030: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3040: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
3050: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
3060: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
3070: 0a 20 20 75 38 20 6f 70 20 3d 20 70 45 78 70 72  .  u8 op = pExpr
3080: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
3090: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
30a0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20   = pExpr->op2;. 
30b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54   if( op==TK_VECT
30c0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
30d0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
30e0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20  >nExpr;.  }else 
30f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
3100: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
3110: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
3120: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
3130: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3140: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
3150: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
3160: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 65 78  inter to a subex
3170: 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56 65 63  pression of pVec
3180: 74 6f 72 20 74 68 61 74 20 69 73 20 74 68 65 20  tor that is the 
3190: 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  i-th.** column o
31a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 28 6e 75  f the vector (nu
31b0: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
31c0: 77 69 74 68 20 30 29 2e 20 20 54 68 65 20 63 61  with 0).  The ca
31d0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73  ller must.** ens
31e0: 75 72 65 20 74 68 61 74 20 69 20 69 73 20 77 69  ure that i is wi
31f0: 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a  thin range..**.*
3200: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
3210: 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61 72 20  really a scalar 
3220: 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20 68 65  (and "scalar" he
3230: 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75 62 71  re includes subq
3240: 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74 20 72  ueries.** that r
3250: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63  eturn a single c
3260: 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72 65 74  olumn!) then ret
3270: 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f  urn pVector unmo
3280: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56  dified..**.** pV
3290: 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20 6f 77  ector retains ow
32a0: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 72  nership of the r
32b0: 65 74 75 72 6e 65 64 20 73 75 62 65 78 70 72 65  eturned subexpre
32c0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
32d0: 74 68 65 20 76 65 63 74 6f 72 20 69 73 20 61 20  the vector is a 
32e0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65  (SELECT ...) the
32f0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3300: 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20   returned is.** 
3310: 6a 75 73 74 20 74 68 65 20 65 78 70 72 65 73 73  just the express
3320: 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ion for the i-th
3330: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
3340: 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d 61 79  ult set, and may
3350: 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 79  .** not be ready
3360: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 20   for evaluation 
3370: 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c  because the tabl
3380: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
3390: 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73   yet.** been pos
33a0: 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72  itioned..*/.Expr
33b0: 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46   *sqlite3VectorF
33c0: 69 65 6c 64 53 75 62 65 78 70 72 28 45 78 70 72  ieldSubexpr(Expr
33d0: 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74 20 69   *pVector, int i
33e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73  ){.  assert( i<s
33f0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
3400: 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20 29 3b  Size(pVector) );
3410: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
3420: 70 72 49 73 56 65 63 74 6f 72 28 70 56 65 63 74  prIsVector(pVect
3430: 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  or) ){.    asser
3440: 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d  t( pVector->op2=
3450: 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f  =0 || pVector->o
3460: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
3470: 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f  ;.    if( pVecto
3480: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3490: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32   || pVector->op2
34a0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
34b0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
34c0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
34d0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
34e0: 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
34f0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65 63       return pVec
3500: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
3510: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
3520: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65    }.  return pVe
3530: 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ctor;.}../*.** C
3540: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
3550: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
3560: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
3570: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3580: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3590: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
35a0: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
35b0: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
35c0: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
35d0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
35e0: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
35f0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3600: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3610: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
3620: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
3630: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
3640: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
3650: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
3660: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3670: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3680: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3690: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
36a0: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
36b0: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
36c0: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
36d0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
36e0: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
36f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3700: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3710: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
3720: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
3730: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
3740: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
3750: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
3760: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
3770: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3780: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3790: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
37a0: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
37b0: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
37c0: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
37d0: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
37e0: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
37f0: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3800: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3810: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
3820: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
3830: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
3840: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
3850: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
3860: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
3870: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3880: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3890: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
38a0: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
38b0: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
38c0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
38d0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
38e0: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
38f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3900: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3910: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3920: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
3930: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3940: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
3950: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
3960: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
3970: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3980: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3990: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
39a0: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
39b0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
39c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
39d0: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
39e0: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
39f0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3a00: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3a10: 6f 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63  or->eX==EX_Selec
3a20: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t );.    /* The 
3a30: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
3a40: 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20   Expr node:.    
3a50: 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a  **.    ** pLeft:
3a60: 20 20 20 20 20 20 20 20 20 20 20 70 56 65 63 74             pVect
3a70: 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b  or containing TK
3a80: 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65  _SELECT.  Not de
3a90: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52  leted..    ** pR
3aa0: 69 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e  ight:          n
3ab0: 6f 74 20 75 73 65 64 2e 20 20 42 75 74 20 72 65  ot used.  But re
3ac0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
3ad0: 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d  d..    ** iColum
3ae0: 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65 78  n:         Index
3af0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
3b00: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69  pVector.    ** i
3b10: 54 61 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20  Table:          
3b20: 30 20 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20  0 or the number 
3b30: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68  of columns on th
3b40: 65 20 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69  e LHS of an assi
3b50: 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c  gnment.    ** pL
3b60: 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46  eft->iTable:   F
3b70: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3b80: 20 6f 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c   of register hol
3b90: 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20  ding result, or 
3ba0: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
3bb0: 20 20 20 20 20 20 20 20 20 20 69 66 20 74 68 65            if the
3bc0: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79   result is not y
3bd0: 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20  et computed..   
3be0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   **.    ** sqlit
3bf0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 20 73  e3ExprDelete() s
3c00: 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70  pecifically skip
3c10: 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
3c20: 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a  delete of.    **
3c30: 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c   pLeft on TK_SEL
3c40: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3c50: 2e 20 20 42 75 74 20 70 52 69 67 68 74 20 69 73  .  But pRight is
3c60: 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56   followed, so pV
3c70: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e  ector.    ** can
3c80: 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20   be attached to 
3c90: 70 52 69 67 68 74 20 74 6f 20 63 61 75 73 65 20  pRight to cause 
3ca0: 74 68 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b  this node to tak
3cb0: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20  e ownership of. 
3cc0: 20 20 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20     ** pVector.  
3cd0: 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20  Typically there 
3ce0: 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65  will be multiple
3cf0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3d00: 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77  N nodes.    ** w
3d10: 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65  ith the same pLe
3d20: 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ft pointer to th
3d30: 65 20 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f  e pVector, but o
3d40: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
3d50: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20      ** will own 
3d60: 74 68 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20  the pVector..   
3d70: 20 2a 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73   */.    pRet = s
3d80: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
3d90: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  se, TK_SELECT_CO
3da0: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
3db0: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
3dc0: 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e     pRet->iColumn
3dd0: 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20   = iField;.     
3de0: 20 70 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70   pRet->pLeft = p
3df0: 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Vector;.    }.  
3e00: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
3e10: 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c  0 || pRet->iTabl
3e20: 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  e==0 );.  }else{
3e30: 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72  .    if( pVector
3e40: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ->op==TK_VECTOR 
3e50: 29 20 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63  ) pVector = pVec
3e60: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
3e70: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
3e80: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
3e90: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
3ea0: 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29  >db, pVector, 0)
3eb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3ec0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
3ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
3ee0: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3ef0: 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
3f00: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
3f10: 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20  e.** it. Return 
3f20: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
3f30: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3f40: 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20   is stored (or, 
3f50: 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  if the .** sub-s
3f60: 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f  elect returns mo
3f70: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
3f80: 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e  mn, the first in
3f90: 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20   an array.** of 
3fa0: 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68 69  registers in whi
3fb0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ch the result is
3fc0: 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20   stored)..**.** 
3fd0: 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  If pExpr is not 
3fe0: 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72  a TK_SELECT expr
3ff0: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30  ession, return 0
4000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4010: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
4020: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4030: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4040: 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69   int reg = 0;.#i
4050: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4060: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
4070: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
4080: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67  ELECT ){.    reg
4090: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
40a0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
40b0: 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
40c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
40d0: 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n reg;.}../*.** 
40e0: 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f 72  Argument pVector
40f0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65 63   points to a vec
4100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 2d  tor expression -
4110: 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45 43   either a TK_VEC
4120: 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c  TOR.** or TK_SEL
4130: 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e 73  ECT that returns
4140: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
4150: 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63  olumn. This func
4160: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
4170: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
4180: 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74 65  ber of a registe
4190: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
41a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
41b0: 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f  element iField o
41c0: 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a  f the vector..**
41d0: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
41e0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78  s a TK_SELECT ex
41f0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63  pression, then c
4200: 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74 20  ode for it must 
4210: 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79  have .** already
4220: 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
4230: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43 6f  using the exprCo
4240: 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72 6f  deSubselect() ro
4250: 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a  utine. In this.*
4260: 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65 72  * case parameter
4270: 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75 6c   regSelect shoul
4280: 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20 69  d be the first i
4290: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
42a0: 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61  gisters.** conta
42b0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
42c0: 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  s of the sub-sel
42d0: 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ect. .**.** If p
42e0: 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79 70  Vector is of typ
42f0: 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65  e TK_VECTOR, the
4300: 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 72  n code for the r
4310: 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a 2a  equested field.*
4320: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20  * is generated. 
4330: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a 70  In this case (*p
4340: 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65 20  RegFree) may be 
4350: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4360: 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  r of.** a tempor
4370: 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f 20  ary register to 
4380: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
4390: 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72 65  caller before re
43a0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42  turning..**.** B
43b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
43c0: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
43d0: 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20 73  r (*ppExpr) is s
43e0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
43f0: 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63  he.** Expr objec
4400: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
4410: 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d  to element iElem
4420: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a   of the vector..
4430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
4440: 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72  prVectorRegister
4450: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4460: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4470: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
4480: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
4490: 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20 20  pVector,        
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
44b0: 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20 65  tor to extract e
44c0: 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20  lement from */. 
44d0: 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20 20   int iField,    
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78 74   /* Field to ext
4500: 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74 6f  ract from pVecto
4510: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 65  r */.  int regSe
4520: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  lect,           
4530: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4540: 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  in array of regi
4550: 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  sters */.  Expr 
4560: 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20  **ppExpr,       
4570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4580: 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65 6c  T: Expression el
4590: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ement */.  int *
45a0: 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20 20  pRegFree        
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
45c0: 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  T: Temp register
45d0: 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20   to free */.){. 
45e0: 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f 72   u8 op = pVector
45f0: 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  ->op;.  assert( 
4600: 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c  op==TK_VECTOR ||
4610: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
4620: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   || op==TK_SELEC
4630: 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  T );.  if( op==T
4640: 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
4650: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
4660: 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
4670: 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20 69  bexpr(pVector, i
4680: 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Field);.    retu
4690: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61 62  rn pVector->iTab
46a0: 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20  le+iField;.  }. 
46b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
46c0: 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  CT ){.    *ppExp
46d0: 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  r = pVector->x.p
46e0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
46f0: 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b  a[iField].pExpr;
4700: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 67  .     return reg
4710: 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20  Select+iField;. 
4720: 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70   }.  *ppExpr = p
4730: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
4740: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4750: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4760: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
4770: 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c 20  Parse, *ppExpr, 
4780: 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  pRegFree);.}../*
4790: 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
47a0: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
47b0: 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77 6f  ison between two
47c0: 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e 20   vector values. 
47d0: 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 72  Compute.** the r
47e0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d  esult of the com
47f0: 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f  parison (1, 0, o
4800: 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69 74  r NULL) and writ
4810: 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  e that.** result
4820: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 64   into register d
4830: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  est..**.** The c
4840: 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69 73  aller must satis
4850: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
4860: 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   preconditions:.
4870: 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70  **.**    if pExp
4880: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20  r->op==TK_IS:   
4890: 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64     op==TK_EQ and
48a0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
48b0: 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70  EQ.**    if pExp
48c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a  r->op==TK_ISNOT:
48d0: 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64     op==TK_NE and
48e0: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
48f0: 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  EQ.**    otherwi
4900: 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  se:             
4910: 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70     op==pExpr->op
4920: 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74   and p5==0.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56 65  atic void codeVe
4940: 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20 50  ctorCompare(.  P
4950: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4960: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e       /* Code gen
4970: 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a  erator context *
4980: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
4990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
49a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
49b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ation */.  int d
49c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
49d0: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
49e0: 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  s into this regi
49f0: 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c  ster */.  u8 op,
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  /* Comparison op
4a20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70  erator */.  u8 p
4a30: 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
4a40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c    /* SQLITE_NULL
4a50: 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b  EQ or zero */.){
4a60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4a70: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
4a80: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
4a90: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72  r->pLeft;.  Expr
4aa0: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
4ab0: 2d 3e 78 2e 70 52 69 67 68 74 3b 0a 20 20 69 6e  ->x.pRight;.  in
4ac0: 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  t nLeft = sqlite
4ad0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
4ae0: 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
4af0: 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d  .  int regLeft =
4b00: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67   0;.  int regRig
4b10: 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78  ht = 0;.  u8 opx
4b20: 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64   = op;.  int add
4b30: 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  rDone = sqlite3V
4b40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4b50: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4b60: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4b70: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4b80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4b90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4ba0: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4bb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4bc0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4bd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4be0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4bf0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4c00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
4c10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4c20: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
4c30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
4c40: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4c50: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4c60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4c70: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4c80: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4c90: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4ca0: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4cb0: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4cc0: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4cd0: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4ce0: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
4cf0: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
4d00: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
4d10: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
4d20: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
4d30: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
4d40: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4d50: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4d60: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4d70: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4d80: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4d90: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4da0: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4db0: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4dc0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4dd0: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4de0: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
4df0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
4e00: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
4e10: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
4e20: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
4e30: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
4e40: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4e50: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4e60: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4e70: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4e80: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4e90: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4ea0: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
4eb0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4ec0: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
4ed0: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
4ee0: 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70  1);.    r2 = exp
4ef0: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4f00: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
4f10: 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52  i, regRight, &pR
4f20: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
4f30: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
4f40: 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70  arse, pL, pR, op
4f50: 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c  x, r1, r2, dest,
4f60: 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61   p5);.    testca
4f70: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
4f80: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f90: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
4fa0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4fb0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
4fc0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
4fd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4fe0: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
4ff0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
5000: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Gt);.    test
5010: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
5020: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5030: 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
5040: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
5050: 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
5060: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
5070: 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  q);.    testcase
5080: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
5090: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
50a0: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71  ==OP_Ne);.    sq
50b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
50c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
50d0: 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ree1);.    sqlit
50e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
50f0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
5100: 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  2);.    if( i==n
5110: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
5120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5130: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
5140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5150: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5160: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
5170: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
5180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
5190: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
51a0: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
51b0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
51c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
51d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
51e0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
51f0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
5200: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
5210: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
5220: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
5230: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
5240: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
5250: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
5260: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
5270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5280: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
5290: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
52a0: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
52b0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
52c0: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
52d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
52e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
52f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5300: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
5310: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
5320: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5330: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
5340: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
5350: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
5360: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
5370: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5380: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
5390: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
53a0: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
53b0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
53c0: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
53d0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
53e0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
53f0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
5400: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5410: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5420: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5430: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5440: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5450: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
5460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
5470: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5480: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5490: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
54a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
54b0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
54c0: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
54d0: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
54e0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
54f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5500: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5510: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5520: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5530: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5540: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5550: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5560: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5590: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
55a0: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
55b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
55c0: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
55d0: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
55e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
55f0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5600: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5610: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5620: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5630: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5640: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5650: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
5660: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5670: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5680: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5690: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
56a0: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
56b0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
56c0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
56d0: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
56e0: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
56f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5700: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5710: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5720: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5730: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5740: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5750: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
5760: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5770: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5780: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5790: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
57a0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
57b0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
57c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
57d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
57e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
57f0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5800: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5810: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5830: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5840: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74  ct *pSelect, int
5850: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53   *pnHeight){.  S
5860: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28  elect *p;.  for(
5870: 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d  p=pSelect; p; p=
5880: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
58a0: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
58b0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
58c0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
58d0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58e0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
58f0: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
5900: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5910: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
5920: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5930: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5940: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
5950: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5960: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5970: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
5980: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5990: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
59a0: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
59b0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
59c0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
59d0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
59e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
59f0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5a00: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5a10: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
5a20: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5a30: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5a40: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5a50: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5a60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5a70: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5a80: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5a90: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5aa0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5ab0: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5ac0: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
5ad0: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
5ae0: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
5af0: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
5b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5b10: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
5b20: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5b30: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5b40: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5b50: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5b60: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 58 20    switch( p->eX 
5b70: 29 7b 0a 20 20 20 20 63 61 73 65 20 45 58 5f 53  ){.    case EX_S
5b80: 65 6c 65 63 74 3a 20 7b 0a 20 20 20 20 20 20 68  elect: {.      h
5b90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
5ba0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
5bb0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 72 65  ight);.      bre
5bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5bd0: 73 65 20 45 58 5f 4c 69 73 74 3a 20 7b 0a 20 20  se EX_List: {.  
5be0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5bf0: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
5c00: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   &nHeight);.    
5c10: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5c20: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5c30: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5c40: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c60: 7d 0a 20 20 20 20 63 61 73 65 20 45 58 5f 52 69  }.    case EX_Ri
5c70: 67 68 74 3a 20 7b 0a 20 20 20 20 20 20 68 65 69  ght: {.      hei
5c80: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 78 2e 70  ghtOfExpr(p->x.p
5c90: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5ca0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5cb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48     }.  }.  p->nH
5cc0: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
5cd0: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
5ce0: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
5cf0: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
5d00: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
5d10: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
5d20: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
5d30: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
5d40: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
5d50: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
5d60: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
5d70: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
5d80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  se..**.** Also p
5d90: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5da0: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5db0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
5dc0: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
5dd0: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
5de0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
5df0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
5e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5e10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5e20: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
5e30: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
5e40: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
5e50: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
5e60: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
5e70: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
5e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5e90: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5ea0: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
5eb0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5ec0: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
5ed0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5ee0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
5ef0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
5f00: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
5f10: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
5f20: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
5f30: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
5f40: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
5f50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
5f60: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ight;.}.#else /*
5f70: 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74 20   ABOVE:  Height 
5f80: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62  enforcement enab
5f90: 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69  led.  BELOW: Hei
5fa0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5fb0: 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  off */./*.** Pro
5fc0: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5fd0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5fe0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5ff0: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
6000: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
6010: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6020: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
6030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6040: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  r *p){.  if( p &
6050: 26 20 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74  & p->eX==EX_List
6060: 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73   ){.    p->flags
6070: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6080: 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   & sqlite3ExprLi
6090: 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69  stFlags(p->x.pLi
60a0: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  st);.  }.}.#defi
60b0: 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  ne exprSetHeight
60c0: 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  (y).#endif /* SQ
60d0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
60e0: 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PTH>0 */../*.** 
60f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6100: 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74  the core allocat
6110: 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65  or for Expr node
6120: 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  s..**.** Constru
6130: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
6140: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
6150: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6160: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
6170: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e  for this node an
6180: 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e  d for the pToken
6190: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73   argument is a s
61a0: 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
61b0: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
61c0: 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
61d0: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
61e0: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
61f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
6200: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
6210: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
6220: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a   gets freed..**.
6230: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
6240: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
6250: 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69  token (if it exi
6260: 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65 64  sts) is dequoted
6270: 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  ..** If dequote 
6280: 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71  is false, no deq
6290: 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72  uoting is perfor
62a0: 6d 65 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74  med.  The deQuot
62b0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  e.** parameter i
62c0: 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f  s ignored if pTo
62d0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  ken is NULL or i
62e0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73  f the token does
62f0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74   not.** appear t
6300: 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66  o be quoted.  If
6310: 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65   the quotes were
6320: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e   of the form "..
6330: 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ." (double-quote
6340: 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45  s).** then the E
6350: 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67  P_DblQuoted flag
6360: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65   is set on the e
6370: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a  xpression node..
6380: 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61  **.** Special ca
6390: 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49  se:  If op==TK_I
63a0: 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65  NTEGER and pToke
63b0: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  n points to a st
63c0: 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ring that.** can
63d0: 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69   be translated i
63e0: 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nto a 32-bit int
63f0: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74  eger, then the t
6400: 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  oken is not.** s
6410: 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65  tored in u.zToke
6420: 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  n.  Instead, the
6430: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
6440: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6450: 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20  to u.iValue and 
6460: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
6470: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f  flag is set.  No
6480: 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a   extra storage.*
6490: 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74  * is allocated t
64a0: 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  o hold the integ
64b0: 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20  er text and the 
64c0: 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20  dequote flag is 
64d0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72  ignored..*/.Expr
64e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c   *sqlite3ExprAll
64f0: 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc(.  sqlite3 *d
6500: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
6510: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
6520: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6530: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  () */.  int op, 
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6560: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
6570: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
6580: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
6590: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
65a0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ULL */.  int deq
65b0: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
65c0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
65d0: 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ote */.){.  Expr
65e0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45   *pNew;.  int nE
65f0: 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xtra = 0;.  int 
6600: 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61  iValue = 0;..  a
6610: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
6620: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6630: 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49      if( op!=TK_I
6640: 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e  NTEGER || pToken
6650: 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ->z==0.         
6660: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
6670: 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26  t32(pToken->z, &
6680: 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20  iValue)==0 ){.  
6690: 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f      nExtra = pTo
66a0: 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20  ken->n+1;.      
66b0: 61 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d  assert( iValue>=
66c0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  0 );.    }.  }. 
66d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
66e0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
66f0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45   sizeof(Expr)+nE
6700: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65  xtra);.  if( pNe
6710: 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  w ){.    memset(
6720: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
6730: 45 78 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77  Expr));.    pNew
6740: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
6750: 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20     pNew->iAgg = 
6760: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  -1;.    if( pTok
6770: 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  en ){.      if( 
6780: 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  nExtra==0 ){.   
6790: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
67a0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c   |= EP_IntValue|
67b0: 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20  EP_Leaf;.       
67c0: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
67d0: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
67e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
67f0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
6800: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
6810: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6820: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
6830: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
6840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
6850: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
6860: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
6870: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
6880: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
6890: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
68a0: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
68b0: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
68c0: 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75  e && sqlite3Isqu
68d0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
68e0: 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  en[0]) ){.      
68f0: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
6900: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
6910: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6920: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
6930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6940: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
6950: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
6960: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6970: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
6980: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
6990: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
69a0: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
69b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
69c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
69d0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
69e0: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
69f0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
6a00: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
6a10: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
6a20: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
6a30: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
6a40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6a50: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
6a60: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
6a70: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
6a80: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
6a90: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6aa0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6ab0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6ad0: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6ae0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6af0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6b00: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
6b10: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
6b20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6b30: 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  30(zToken);.  re
6b40: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
6b50: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
6b60: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
6b70: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
6b80: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
6b90: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
6ba0: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
6bb0: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
6bc0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
6bd0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
6be0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
6bf0: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
6c00: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
6c10: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6c20: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
6c30: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
6c40: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
6c50: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
6c60: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
6c70: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
6c80: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
6c90: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
6ca0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6cb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6cd0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
6ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6cf0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6d00: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6d10: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
6d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
6d30: 6f 6f 74 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65  oot->eX==EX_None
6d40: 20 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   );.      pRoot-
6d50: 3e 78 2e 70 52 69 67 68 74 20 3d 20 70 52 69 67  >x.pRight = pRig
6d60: 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ht;.      pRoot-
6d70: 3e 65 58 20 3d 20 45 58 5f 52 69 67 68 74 3b 0a  >eX = EX_Right;.
6d80: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6d90: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6da0: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
6db0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
6dc0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6dd0: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6de0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
6df0: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6e00: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
6e10: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6e20: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
6e30: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
6e40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6e50: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6e60: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
6e70: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
6e80: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
6e90: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
6ea0: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
6eb0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
6ec0: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6ed0: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6ee0: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6ef0: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6f00: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6f10: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6f20: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6f30: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6f50: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6f60: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6f70: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6f80: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6fa0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6fb0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6fc0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6fd0: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6fe0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6ff0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
7000: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
7010: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
7020: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
7030: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
7040: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
7050: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
7060: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
7070: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
7080: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
7090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
70a0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
70b0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
70d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
70e0: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
70f0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
7100: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
7110: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
7120: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
7130: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
7140: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
7150: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
7160: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7170: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
7180: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
7190: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
71a0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
71b0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
71c0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
71d0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
71e0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
71f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
7200: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
7210: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
7220: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
7230: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
7240: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
7250: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
7260: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
7270: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
7280: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
7290: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
72a0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
72b0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
72c0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
72d0: 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
72e0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 73  Select ){.    as
72f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
7300: 3d 45 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =EX_None );.    
7310: 70 45 78 70 72 2d 3e 65 58 20 3d 20 45 58 5f 53  pExpr->eX = EX_S
7320: 65 6c 65 63 74 3b 0a 20 20 20 20 70 45 78 70 72  elect;.    pExpr
7330: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
7340: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
7350: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
7360: 2c 20 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  , EP_Subquery);.
7370: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
7380: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
7390: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
73a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
73b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
73c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
73d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
73e0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
73f0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
7400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
7410: 20 45 78 70 72 4c 69 73 74 20 74 6f 20 74 68 65   ExprList to the
7420: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 66 69   Expr.x.pList fi
7430: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
7440: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
7450: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
7460: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
7470: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
7480: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
7490: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
74a0: 65 33 50 45 78 70 72 41 64 64 45 78 70 72 4c 69  e3PExprAddExprLi
74b0: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
74c0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 45  , Expr *pExpr, E
74d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
74e0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
74f0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
7500: 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
7510: 45 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 70  EX_None );.    p
7520: 45 78 70 72 2d 3e 65 58 20 3d 20 45 58 5f 4c 69  Expr->eX = EX_Li
7530: 73 74 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78  st;.    pExpr->x
7540: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
7550: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78      /* sqlite3Ex
7560: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
7570: 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  ags(pParse, pExp
7580: 72 29 3b 20 2f 2f 20 64 6f 6e 65 20 62 79 20 63  r); // done by c
7590: 61 6c 6c 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65  aller */.  }else
75a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
75b0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
75c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
75d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
75e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
75f0: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  pList);.  }.}...
7600: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
7610: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
7620: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
7630: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
7640: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7650: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7660: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7670: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7680: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7690: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
76a0: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
76b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
76c0: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
76d0: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
76e0: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
76f0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
7700: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
7710: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
7720: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
7730: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
7740: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7750: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7760: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7770: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7780: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7790: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
77a0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
77b0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
77c0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
77d0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
77e0: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
77f0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
7800: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
7810: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
7820: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
7830: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
7840: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7850: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7860: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7880: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7890: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
78a0: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
78b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
78c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
78d0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
78e0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
78f0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
7900: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
7910: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
7920: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
7930: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7940: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7950: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7960: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7970: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7980: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7990: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
79a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
79b0: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
79c0: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
79d0: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
79e0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
79f0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
7a00: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
7a10: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
7a20: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
7a30: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
7a40: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7a50: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7a60: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7a70: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7a80: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7a90: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7aa0: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7ab0: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7ac0: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7ad0: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7ae0: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
7af0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
7b00: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
7b10: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
7b20: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
7b30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7b40: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7b50: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7b60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7b70: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7b80: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7b90: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7ba0: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7bb0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7bc0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7bd0: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7be0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7bf0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7c00: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7c10: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
7c20: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
7c30: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
7c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7c50: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7c60: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7c70: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7c80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7c90: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7ca0: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7cb0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7cc0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7cd0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7ce0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
7cf0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
7d00: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
7d10: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
7d20: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
7d30: 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50  xprFunction(.  P
7d40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7d50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7d60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
7d70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
7d80: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c     /* Argument l
7d90: 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
7da0: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
7db0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7dc0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
7dd0: 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  eDistinct       
7de0: 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74    /* SF_Distinct
7df0: 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20   or SF_ALL or 0 
7e00: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
7e10: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
7e20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7e30: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7e40: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
7e50: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7e60: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
7e70: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
7e80: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
7e90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7ea0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
7eb0: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
7ec0: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
7ed0: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
7ee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ef0: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
7f00: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72  st->nExpr > pPar
7f10: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
7f20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7f30: 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20  TION_ARG] ){.   
7f40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7f50: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
7f60: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
7f70: 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54  function %T", pT
7f80: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  oken);.  }.  ass
7f90: 65 72 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d 45  ert( pNew->eX==E
7fa0: 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 69 66 28 20  X_None );.  if( 
7fb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65  pList ){.    pNe
7fc0: 77 2d 3e 65 58 20 3d 20 45 58 5f 4c 69 73 74 3b  w->eX = EX_List;
7fd0: 0a 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  .    pNew->x.pLi
7fe0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 0a  st = pList;.  }.
7ff0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
8000: 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75  y(pNew, EP_HasFu
8010: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nc);.  sqlite3Ex
8020: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
8030: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
8040: 29 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e  );.  if( eDistin
8050: 63 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ct==SF_Distinct 
8060: 29 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74  ) ExprSetPropert
8070: 79 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69  y(pNew, EP_Disti
8080: 6e 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  nct);.  return p
8090: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
80a0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
80b0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
80c0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
80d0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
80e0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
80f0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
8100: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
8110: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
8120: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
8130: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
8140: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
8150: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
8160: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
8170: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
8180: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
8190: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
81a0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
81b0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
81c0: 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61  not too big to a
81d0: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
81e0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
81f0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
8200: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
8210: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
8220: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
8230: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
8240: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
8250: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
8260: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
8270: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
8280: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
8290: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
82a0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
82b0: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
82c0: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
82d0: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
82e0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
82f0: 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65  uential variable
8300: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
8310: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
8320: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
8330: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
8340: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8350: 70 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20  pExpr, u32 n){. 
8360: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8370: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e  Parse->db;.  con
8380: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e  st char *z;.  yn
8390: 56 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45  Var x;..  if( pE
83a0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
83b0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
83c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
83d0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
83e0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
83f0: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
8400: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
8410: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
8420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
8430: 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  0]!=0 );.  asser
8440: 74 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74  t( n==(u32)sqlit
8450: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b  e3Strlen30(z) );
8460: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
8470: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
8480: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
8490: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
84a0: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
84b0: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
84c0: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
84d0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28      x = (ynVar)(
84e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
84f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
8500: 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20  t doAdd = 0;.   
8510: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
8520: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
8530: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
8540: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
8550: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
8560: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
8570: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
8580: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
8590: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
85a0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20        int bOk;. 
85b0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
85c0: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
85d0: 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20  IF-TRUE*/.      
85e0: 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20    i = z[1]-'0'; 
85f0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
8600: 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20  ase of ?N for a 
8610: 73 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a  single digit N *
8620: 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  /.        bOk = 
8630: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
8640: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d          bOk = 0=
8650: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
8660: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
8670: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
8680: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
8690: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
86a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
86b0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
86c0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
86d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
86e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
86f0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
8700: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
8710: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8720: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8730: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
8740: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
8750: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
8760: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8770: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8790: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
87a0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
87b0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
87c0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
87d0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
87e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
87f0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8800: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8810: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8820: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
8830: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
8840: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
8850: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
8860: 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20  = (int)x;.      
8870: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8880: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
8890: 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
88a0: 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
88b0: 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, x)==0 ){.    
88c0: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
88d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
88e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
88f0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
8900: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
8910: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
8920: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
8930: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
8940: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
8950: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
8960: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
8970: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
8980: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
8990: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
89a0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
89b0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
89c0: 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  /.      x = (ynV
89d0: 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  ar)sqlite3VListN
89e0: 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d  ameToNum(pParse-
89f0: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a  >pVList, z, n);.
8a00: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
8a10: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79  {.        x = (y
8a20: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8a30: 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64  nVar);.        d
8a40: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
8a50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8a60: 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70  doAdd ){.      p
8a70: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
8a80: 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28  sqlite3VListAdd(
8a90: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  db, pParse->pVLi
8aa0: 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20  st, z, n, x);.  
8ab0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d    }.  }.  pExpr-
8ac0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20  >iColumn = x;.  
8ad0: 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74  if( x>db->aLimit
8ae0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8af0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8b10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8b20: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
8b30: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
8b40: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
8b50: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
8b60: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8b70: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8b80: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
8b90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
8bb0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
8bc0: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
8bd0: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
8be0: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
8bf0: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
8c00: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
8c10: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8c40: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
8c50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8c60: 2d 3e 65 58 21 3d 45 58 5f 53 65 6c 65 63 74 20  ->eX!=EX_Select 
8c70: 7c 7c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 21  || p->x.pSelect!
8c80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8c90: 70 2d 3e 65 58 21 3d 45 58 5f 4c 69 73 74 20 7c  p->eX!=EX_List |
8ca0: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  | p->x.pList!=0 
8cb0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8cc0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78 70  _DEBUG.  if( Exp
8cd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8ce0: 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70  EP_Leaf) && !Exp
8cf0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8d00: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
8d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8d20: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
8d30: 61 73 73 65 72 74 28 20 70 2d 3e 65 58 3d 3d 45  assert( p->eX==E
8d40: 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 7d 0a 20 20  X_None );.  }.  
8d50: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8d60: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8d70: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
8d80: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8d90: 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 2d 3e 70 4c  UNCTION || p->pL
8da0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eft==0 );.  }.  
8db0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8dc0: 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b 65  erty(p, (EP_Toke
8dd0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
8de0: 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
8df0: 28 20 70 2d 3e 70 57 69 6e 3d 3d 30 20 7c 7c 20  ( p->pWin==0 || 
8e00: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
8e10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 57     assert( p->pW
8e20: 69 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 54 61 62  in==0 || p->pTab
8e30: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
8e40: 74 28 20 70 2d 3e 70 57 69 6e 3d 3d 30 20 7c 7c  t( p->pWin==0 ||
8e50: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
8e60: 49 4f 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ION );.    asser
8e70: 74 28 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c  t( p->pTab==0 ||
8e80: 20 70 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20   p->eX==EX_None 
8e90: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
8ea0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8eb0: 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b 65  erty(p, (EP_Toke
8ec0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
8ed0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  ){.    if( p->pL
8ee0: 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b  eft && p->op!=TK
8ef0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
8f00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8f10: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66  teNN(db, p->pLef
8f20: 74 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  t);.    switch( 
8f30: 70 2d 3e 65 58 20 29 7b 0a 20 20 20 20 20 20 63  p->eX ){.      c
8f40: 61 73 65 20 45 58 5f 53 65 6c 65 63 74 3a 20 7b  ase EX_Select: {
8f50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8f60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
8f70: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
8f80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
8fa0: 65 20 45 58 5f 4c 69 73 74 3a 20 7b 0a 20 20 20  e EX_List: {.   
8fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8fc0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8fd0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ff0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 45 58   }.      case EX
9000: 5f 52 69 67 68 74 3a 20 7b 0a 20 20 20 20 20 20  _Right: {.      
9010: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9020: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 52 69  ete(db, p->x.pRi
9030: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ght);.        br
9040: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9050: 20 7d 0a 20 20 20 20 69 66 28 20 21 45 78 70 72   }.    if( !Expr
9060: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9070: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
9080: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
9090: 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  wDelete(db, p->p
90a0: 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Win);.    }.  }.
90b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
90c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
90d0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
90e0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
90f0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45  Token);.  if( !E
9100: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9110: 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a  , EP_Static) ){.
9120: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9130: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
9140: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
9150: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
9160: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
9170: 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65    if( p ) sqlite
9180: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
9190: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
91a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
91b0: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
91c0: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
91d0: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
91e0: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
91f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9200: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
9210: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
9220: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
9230: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
9240: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9250: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
9260: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
9270: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
9280: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9290: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
92a0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
92b0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
92c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
92d0: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
92e0: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
92f0: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
9300: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
9310: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
9320: 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a  he dupedExpr*Siz
9330: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63  e() routines eac
9340: 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  h return the num
9350: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9360: 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72  uired.** to stor
9370: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  e a copy of an e
9380: 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70  xpression or exp
9390: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54  ression tree.  T
93a0: 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a  hey differ in.**
93b0: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
93c0: 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65   tree is measure
93d0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70  d..**.**     dup
93e0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
93f0: 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f  ()     Size of o
9400: 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72  nly the Expr str
9410: 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64  ucture .**     d
9420: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9430: 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66  ()       Size of
9440: 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f   Expr + space fo
9450: 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64  r token.**     d
9460: 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20  upedExprSize()  
9470: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20           Expr + 
9480: 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20  token + subtree 
9490: 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a  components.**.**
94a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
94f0: 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72  The dupedExprStr
9500: 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69  uctSize() functi
9510: 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76  on returns two v
9520: 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65  alues OR-ed toge
9530: 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74  ther:  .** (1) t
9540: 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
9550: 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20  d for a copy of 
9560: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
9570: 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20  re only and .** 
9580: 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66  (2) the EP_xxx f
9590: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
95a0: 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75  te what the stru
95b0: 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c  cture size shoul
95c0: 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  d be..** The ret
95d0: 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c  urn values is al
95e0: 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  ways one of:.**.
95f0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c  **      EXPR_FUL
9600: 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58  LSIZE.**      EX
9610: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20  PR_REDUCEDSIZE  
9620: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a   | EP_Reduced.**
9630: 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e        EXPR_TOKEN
9640: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9650: 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68  kenOnly.**.** Th
9660: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74  e size of the st
9670: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66  ructure can be f
9680: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
9690: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
96a0: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74  .** of this rout
96b0: 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20  ine with 0xfff. 
96c0: 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62   The flags can b
96d0: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
96e0: 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ng the.** return
96f0: 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52   value with EP_R
9700: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9710: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  nly..**.** Note 
9720: 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d  that with flags=
9730: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c  =EXPRDUP_REDUCE,
9740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77   this routines w
9750: 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a  orks on full-siz
9760: 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29  e.** (unreduced)
9770: 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73   Expr objects as
9780: 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61   they or origina
9790: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lly constructed 
97a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a  by the parser..*
97b0: 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73  * During express
97c0: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78  ion analysis, ex
97d0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
97e0: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
97f0: 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61  moved into.** la
9800: 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 68 65  ter parts of the
9810: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64   Expr object and
9820: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
9830: 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65  rmation might ge
9840: 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66  t chopped.** off
9850: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9860: 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  on is reduced.  
9870: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69  Note also that i
9880: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
9890: 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58  to.** make an EX
98a0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
98b0: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
98c0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
98d0: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
98e0: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
98f0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
9900: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
9910: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
9920: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
9930: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9940: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
9950: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
9960: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
9970: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
9980: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
9990: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
99a0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
99b0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
99c0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
99d0: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
99e0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
99f0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
9a00: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
9a10: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
9a20: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
9a30: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
9a40: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
9a50: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
9a60: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9a70: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
9a80: 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73  ;.  if( 0==flags
9a90: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45   || p->op==TK_SE
9aa0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66  LECT_COLUMN .#if
9ab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9ac0: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c  _WINDOWFUNC.   |
9ad0: 7c 20 70 2d 3e 70 57 69 6e 20 0a 23 65 6e 64 69  | p->pWin .#endi
9ae0: 66 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  f.  ){.    nSize
9af0: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
9b00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
9b10: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9b20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
9b30: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
9b40: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
9b50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9b60: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
9b70: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
9b80: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9b90: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
9ba0: 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ken) );.    asse
9bb0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9bc0: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
9bd0: 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  uce) );.    if( 
9be0: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 65  p->pLeft || p->e
9bf0: 58 21 3d 45 58 5f 4e 6f 6e 65 20 29 7b 0a 20 20  X!=EX_None ){.  
9c00: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9c10: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9c20: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
9c40: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
9c50: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
9c60: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
9c70: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
9c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9c90: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9ca0: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
9cb0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
9cc0: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
9cd0: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
9ce0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
9cf0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
9d00: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9d10: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
9d20: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
9d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9d40: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
9d50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9d60: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9d70: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
9d80: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
9d90: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
9da0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9db0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
9dc0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
9dd0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
9de0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9df0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
9e00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
9e10: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
9e20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9e30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
9e40: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
9e50: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
9e60: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
9e70: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
9e80: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9e90: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
9ea0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
9eb0: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
9ec0: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
9ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
9ee0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9ef0: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
9f00: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
9f10: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
9f20: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
9f30: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
9f40: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
9f50: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
9f60: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
9f70: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
9f80: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
9f90: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
9fa0: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
9fb0: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
9fc0: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
9fd0: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
9fe0: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
9ff0: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
a000: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
a010: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
a020: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
a030: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
a040: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
a050: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
a060: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
a070: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
a080: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
a090: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
a0a0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
a0b0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
a0c0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
a0d0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a0e0: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
a0f0: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
a100: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
a110: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
a120: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
a130: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
a140: 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 52 69  if( p->eX==EX_Ri
a150: 67 68 74 20 29 20 6e 42 79 74 65 20 2b 3d 20 64  ght ) nByte += d
a160: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
a170: 78 2e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  x.pRight, flags)
a180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a190: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
a1a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a1b0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
a1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a1d0: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
a1e0: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
a1f0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
a200: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
a210: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
a220: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
a230: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
a240: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
a250: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
a260: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
a270: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
a280: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
a290: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
a2a0: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
a2b0: 2d 3e 78 2e 70 52 69 67 68 74 20 65 78 70 72 65  ->x.pRight expre
a2c0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
a2d0: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
a2e0: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
a2f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
a300: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
a310: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
a320: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
a330: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
a340: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
a350: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
a360: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
a370: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
a380: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
a390: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
a3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
a3b0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
a3c0: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
a3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
a3e0: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
a3f0: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
a400: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
a410: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
a420: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
a430: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
a440: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
a450: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
a460: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
a470: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
a480: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
a490: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
a4a0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
a4b0: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
a4c0: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
a4d0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
a4e0: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
a4f0: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
a500: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
a510: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
a520: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
a530: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
a540: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
a550: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
a560: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
a570: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
a580: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
a590: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
a5a0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
a5b0: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
a5c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
a5d0: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
a5e0: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
a5f0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
a600: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
a610: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
a620: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
a630: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
a640: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
a650: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
a660: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
a670: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
a680: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
a690: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
a6a0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a6b0: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
a6c0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
a6d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
a6e0: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
a6f0: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
a700: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
a710: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
a720: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
a730: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
a740: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
a750: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
a760: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
a770: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
a780: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
a790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a7a0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
a7b0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
a7c0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
a7d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
a7e0: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
a7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a800: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
a810: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
a820: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
a830: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a840: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a850: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
a860: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a870: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
a880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
a890: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
a8a0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
a8b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a8c0: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
a8d0: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
a8e0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
a8f0: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
a900: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
a910: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
a920: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
a930: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a940: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
a950: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
a960: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
a970: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
a980: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
a990: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
a9a0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a9b0: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
a9c0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
a9d0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a9e0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
a9f0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
aa00: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
aa10: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
aa20: 69 63 46 6c 61 67 3b 0a 20 20 20 20 61 73 73 65  icFlag;.    asse
aa30: 72 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d 70 2d  rt( pNew->eX==p-
aa40: 3e 65 58 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >eX );.    asser
aa50: 74 28 20 70 4e 65 77 2d 3e 65 56 3d 3d 70 2d 3e  t( pNew->eV==p->
aa60: 65 56 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  eV );..    /* Co
aa70: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
aa80: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
aa90: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
aaa0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
aab0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
aac0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
aad0: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
aae0: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
aaf0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
ab00: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
ab10: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
ab20: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
ab30: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
ab40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
ab50: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
ab60: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
ab70: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
ab80: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
ab90: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
aba0: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 58 20 29   switch( p->eX )
abb0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 45  {.        case E
abc0: 58 5f 53 65 6c 65 63 74 3a 20 7b 0a 20 20 20 20  X_Select: {.    
abd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
abe0: 65 77 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63  ew->eX==EX_Selec
abf0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t );.          p
ac00: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  New->x.pSelect =
ac10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
ac20: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  p(db, p->x.pSele
ac30: 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  ct, dupFlags);. 
ac40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
ac50: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  w->x.pSelect==0 
ac60: 29 20 70 4e 65 77 2d 3e 65 58 20 3d 20 45 58 5f  ) pNew->eX = EX_
ac70: 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  None;.          
ac80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ac90: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 45 58  .        case EX
aca0: 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 20  _List: {.       
acb0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
acc0: 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a  >eX==EX_List );.
acd0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
ace0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
acf0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
ad00: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70   p->x.pList, dup
ad10: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
ad20: 20 20 69 66 28 20 70 4e 65 77 2d 3e 78 2e 70 4c    if( pNew->x.pL
ad30: 69 73 74 3d 3d 30 20 29 20 70 4e 65 77 2d 3e 65  ist==0 ) pNew->e
ad40: 58 20 3d 20 45 58 5f 4e 6f 6e 65 3b 0a 20 20 20  X = EX_None;.   
ad50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ad60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ad70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
ad80: 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66  ll in pNew->pLef
ad90: 74 20 61 6e 64 20 70 4e 65 77 2d 3e 78 2e 70 52  t and pNew->x.pR
ada0: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
adb0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
adc0: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
add0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
ade0: 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  ){.      zAlloc 
adf0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
ae00: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
ae10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  );.      if( !Ex
ae20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
ae30: 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ew, EP_TokenOnly
ae40: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
ae50: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
ae60: 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20   = p->pLeft ?.  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
ae90: 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55  p->pLeft, EXPRDU
aea0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
aeb0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  c) : 0;.        
aec0: 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 52 69  if( p->eX==EX_Ri
aed0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ght ){.         
aee0: 20 70 4e 65 77 2d 3e 78 2e 70 52 69 67 68 74 20   pNew->x.pRight 
aef0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
af00: 3e 78 2e 70 52 69 67 68 74 2c 20 45 58 50 52 44  >x.pRight, EXPRD
af10: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
af20: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oc);.        }. 
af30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
af40: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
af50: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
af60: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
af70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  .    }else{.#ifn
af80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
af90: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
afa0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
afb0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
afc0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
afd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
afe0: 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ->pWin = 0;.    
aff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b000: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 73 71   pNew->pWin = sq
b010: 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64  lite3WindowDup(d
b020: 62 2c 20 70 4e 65 77 2c 20 70 2d 3e 70 57 69 6e  b, pNew, p->pWin
b030: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
b040: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b050: 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
b060: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
b070: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
b080: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
b090: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  f) ){.        if
b0a0: 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53  ( pNew->op==TK_S
b0b0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
b0c0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
b0d0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
b0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
b0f0: 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  rt( p->iColumn==
b100: 30 20 7c 7c 20 70 2d 3e 65 58 21 3d 45 58 5f 52  0 || p->eX!=EX_R
b110: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
b120: 20 20 2f 2a 20 4f 4c 44 3a 20 61 73 73 65 72 74    /* OLD: assert
b130: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20  ( p->pRight==0  
b140: 7c 7c 20 70 2d 3e 78 2e 70 52 69 67 68 74 3d 3d  || p->x.pRight==
b150: 70 2d 3e 70 4c 65 66 74 20 29 3b 20 2a 2f 0a 20  p->pLeft ); */. 
b160: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b170: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
b180: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
b190: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
b1a0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
b1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b1c0: 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 7b 0a  eX==EX_Right ){.
b1d0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
b1e0: 78 2e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  x.pRight = sqlit
b1f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
b200: 3e 78 2e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  >x.pRight, 0);. 
b210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b230: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
b240: 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65  ** Create and re
b250: 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79  turn a deep copy
b260: 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70   of the object p
b270: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
b280: 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ond .** argument
b290: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64  . If an OOM cond
b2a0: 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74  ition is encount
b2b0: 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  ered, NULL is re
b2c0: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68  turned.** and th
b2d0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
b2e0: 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a  ed flag set..*/.
b2f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b300: 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57  MIT_CTE.static W
b310: 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c  ith *withDup(sql
b320: 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
b330: 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74  p){.  With *pRet
b340: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
b350: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b360: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69   sizeof(*p) + si
b370: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b380: 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20  (p->nCte-1);.   
b390: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   pRet = sqlite3D
b3a0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
b3b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
b3c0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  pRet ){.      in
b3d0: 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  t i;.      pRet-
b3e0: 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b  >nCte = p->nCte;
b3f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b400: 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
b410: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
b420: 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  [i].pSelect = sq
b430: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
b440: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  b, p->a[i].pSele
b450: 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
b460: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  pRet->a[i].pCols
b470: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b480: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  stDup(db, p->a[i
b490: 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20  ].pCols, 0);.   
b4a0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
b4b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b4c0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61  bStrDup(db, p->a
b4d0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
b4e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b4f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
b500: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
b510: 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e  thDup(x,y) 0.#en
b520: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
b530: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
b540: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
b550: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
b560: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
b570: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
b580: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
b590: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
b5a0: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
b5b0: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
b5c0: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
b5d0: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
b5e0: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
b5f0: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
b600: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
b610: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
b620: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
b630: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
b640: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
b650: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
b660: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
b670: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
b680: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
b690: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
b6a0: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
b6b0: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
b6c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
b6d0: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
b6e0: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
b6f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
b700: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
b710: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
b720: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
b730: 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  icated..**.** Th
b740: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b750: 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d  r contains a com
b760: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
b770: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
b780: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  s..** If the EXP
b790: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
b7a0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
b7b0: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
b7c0: 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75  rned is a.** tru
b7d0: 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  ncated version o
b7e0: 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72  f the usual Expr
b7f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b800: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  will be stored a
b810: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  s.** part of the
b820: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
b830: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
b840: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
b850: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
b860: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
b870: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
b880: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
b890: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
b8a0: 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  | flags==EXPRDUP
b8b0: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74  _REDUCE );.  ret
b8c0: 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28  urn p ? exprDup(
b8d0: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
b8e0: 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74   : 0;.}.ExprList
b8f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
b900: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b910: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
b920: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
b930: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
b940: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b950: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
b960: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
b970: 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65    Expr *pPriorSe
b980: 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61  lectCol = 0;.  a
b990: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b9a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b9b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
b9c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b9d0: 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33  awNN(db, sqlite3
b9e0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
b9f0: 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77   p));.  if( pNew
ba00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ba10: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
ba20: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65  p->nExpr;.  pIte
ba30: 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70  m = pNew->a;.  p
ba40: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
ba50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ba60: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
ba70: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
ba80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
ba90: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
baa0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  >pExpr;.    Expr
bab0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
bac0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
bad0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bae0: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
baf0: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  s);.    if( pOld
bb00: 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f  Expr .     && pO
bb10: 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53  ldExpr->op==TK_S
bb20: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20  ELECT_COLUMN.   
bb30: 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d    && (pNewExpr =
bb40: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d   pItem->pExpr)!=
bb50: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
bb60: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
bb70: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
bb80: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  i>0 );.      if(
bb90: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
bba0: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
bbb0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70   assert( pOldExp
bbc0: 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78  r->pLeft==pOldEx
bbd0: 70 72 2d 3e 78 2e 70 52 69 67 68 74 20 29 3b 0a  pr->x.pRight );.
bbe0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65          pPriorSe
bbf0: 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78  lectCol = pNewEx
bc00: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  pr->pLeft = pNew
bc10: 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 3b 0a  Expr->x.pRight;.
bc20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
bc40: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
bc50: 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  rt( pItem[-1].pE
bc60: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
bc70: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
bc80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74  pr->iColumn==pIt
bc90: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43  em[-1].pExpr->iC
bca0: 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20  olumn+1 );.     
bcb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
bcc0: 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65  rSelectCol==pIte
bcd0: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65  m[-1].pExpr->pLe
bce0: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ft );.        pN
bcf0: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
bd00: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b  pPriorSelectCol;
bd10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bd20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
bd30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
bd40: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bd50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
bd60: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
bd70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bd80: 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  OldItem->zSpan);
bd90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
bda0: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
bdb0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
bdc0: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
bdd0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70  ;.    pItem->bSp
bde0: 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74  anIsTab = pOldIt
bdf0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a  em->bSpanIsTab;.
be00: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74      pItem->bSort
be10: 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65 6d  erRef = pOldItem
be20: 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20 20  ->bSorterRef;.  
be30: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
be40: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
be50: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
be60: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
be70: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
be80: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
be90: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
bea0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
beb0: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
bec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
bed0: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
bee0: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
bef0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
bf00: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
bf10: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
bf20: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
bf30: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
bf40: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
bf50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
bf60: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
bf70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bf80: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
bf90: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bfa0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
bfb0: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
bfc0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
bfd0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
bfe0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
bff0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
c000: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
c010: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  nt nByte;.  asse
c020: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
c030: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
c040: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
c050: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
c060: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
c070: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
c080: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
c090: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c0a0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
c0b0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
c0c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
c0d0: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
c0e0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
c0f0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
c100: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
c110: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
c120: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
c130: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
c140: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
c150: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
c160: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
c170: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
c180: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
c190: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64  ->pSchema = pOld
c1a0: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  Item->pSchema;. 
c1b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
c1c0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
c1d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
c1e0: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
c1f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
c200: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
c210: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
c220: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
c230: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
c240: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
c250: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
c260: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
c270: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20   pNewItem->fg = 
c280: 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20  pOldItem->fg;.  
c290: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
c2a0: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
c2b0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
c2c0: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
c2d0: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
c2e0: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
c2f0: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
c300: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
c310: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69  regReturn;.    i
c320: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
c330: 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
c340: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
c350: 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
c360: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c370: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
c380: 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
c390: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
c3a0: 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64  >pIBIndex = pOld
c3b0: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  Item->pIBIndex;.
c3c0: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
c3d0: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
c3e0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
c3f0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
c400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c410: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c420: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70  , pOldItem->u1.p
c430: 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b  FuncArg, flags);
c440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
c450: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
c460: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
c470: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
c480: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
c490: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  TabRef++;.    }.
c4a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
c4b0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
c4c0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
c4d0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
c4e0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c4f0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
c500: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c510: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
c520: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
c530: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
c540: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
c550: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
c560: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
c570: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
c580: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
c590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
c5a0: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
c5b0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
c5c0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
c5d0: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
c5e0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
c5f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c600: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
c610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
c620: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c630: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c640: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
c650: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
c660: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
c670: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
c680: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
c690: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c6a0: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
c6b0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
c6c0: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
c6d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c6e0: 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  eNN(db, pNew);. 
c6f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c700: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
c710: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
c720: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
c730: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
c740: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
c750: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
c760: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
c770: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
c780: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
c790: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
c7a0: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
c7b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
c7c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
c7d0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
c7e0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
c7f0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
c800: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
c810: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
c820: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
c830: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
c840: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
c850: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c860: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
c870: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
c880: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
c890: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
c8a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
c8b0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
c8c0: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
c8d0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c  b, Select *pDup,
c8e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
c8f0: 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b  elect *pRet = 0;
c900: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74  .  Select *pNext
c910: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
c920: 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53  *pp = &pRet;.  S
c930: 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73  elect *p;..  ass
c940: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c950: 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70  for(p=pDup; p; p
c960: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
c970: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20   Select *pNew = 
c980: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c990: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
c9a0: 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  *p) );.    if( p
c9b0: 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  New==0 ) break;.
c9c0: 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74      pNew->pEList
c9d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c9e0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
c9f0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ist, flags);.   
ca00: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
ca10: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
ca20: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
ca30: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
ca40: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
ca50: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
ca60: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
ca70: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
ca80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ca90: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
caa0: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
cab0: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
cac0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
cad0: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
cae0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
caf0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
cb00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cb10: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
cb20: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
cb30: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
cb40: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
cb50: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e   = pNext;.    pN
cb60: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
cb70: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74      pNew->pLimit
cb80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
cb90: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
cba0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
cbb0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
cbc0: 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74     pNew->iOffset
cbd0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
cbe0: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
cbf0: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
cc00: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
cc10: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
cc20: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[0] = -1;.    
cc30: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
cc40: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[1] = -1;.    
cc50: 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pNew->nSelectRow
cc60: 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   = p->nSelectRow
cc70: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 74  ;.    pNew->pWit
cc80: 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20  h = withDup(db, 
cc90: 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e 64  p->pWith);.#ifnd
cca0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
ccb0: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70 4e  INDOWFUNC.    pN
ccc0: 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20  ew->pWin = 0;.  
ccd0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
cce0: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
ccf0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
cd00: 57 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64 69 66  WinDefn);.#endif
cd10: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64  .    pNew->selId
cd20: 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20 20   = p->selId;.   
cd30: 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20   *pp = pNew;.   
cd40: 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72   pp = &pNew->pPr
cd50: 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  ior;.    pNext =
cd60: 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65   pNew;.  }..  re
cd70: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
cd80: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
cd90: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
cda0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
cdb0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
cdc0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
cdd0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
cde0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
cdf0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
ce00: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
ce10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
ce20: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
ce30: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
ce40: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
ce50: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
ce60: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
ce70: 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  pList argument m
ce80: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55  ust be either NU
ce90: 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  LL or a pointer 
cea0: 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a  to an ExprList.*
ceb0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
cec0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
ced0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cee0: 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72  ppend().  This r
cef0: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f  outine.** may no
cf00: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
cf10: 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69  n ExprList obtai
cf20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
cf30: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
cf40: 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20  * Reason:  This 
cf50: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
cf60: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
cf70: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73  of slots in pLis
cf80: 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70  t->a[].** is a p
cf90: 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68  ower of two.  Th
cfa0: 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73  at is true for s
cfb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
cfc0: 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a  pend() returns.*
cfd0: 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63  * but is not nec
cfe0: 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72  essarily true fr
cff0: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  om the return va
d000: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78  lue of sqlite3Ex
d010: 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a  prListDup()..**.
d020: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
d030: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
d040: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
d050: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
d060: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
d070: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
d080: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
d090: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
d0a0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
d0b0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
d0c0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
d0d0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
d0e0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
d0f0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
d100: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d120: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d130: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d140: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
d150: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
d160: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
d170: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
d180: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
d190: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
d1a0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
d1b0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
d1c0: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
d1d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d1e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d1f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
d200: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
d210: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d220: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
d230: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
d240: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
d250: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
d260: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
d270: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
d280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
d290: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
d2a0: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
d2b0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
d2c0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
d2d0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
d2e0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
d2f0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
d300: 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20  c(db, pList, .  
d310: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
d320: 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69  f(*pList)+(2*pLi
d330: 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73  st->nExpr - 1)*s
d340: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
d350: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
d360: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
d370: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d380: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
d390: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
d3a0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d3b0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
d3c0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d3d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d3e0: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
d3f0: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
d400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d410: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d420: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
d430: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
d440: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
d450: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
d460: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
d470: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d480: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
d490: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
d4a0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d4b0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
d4c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
d4d0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
d4e0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
d4f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
d500: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
d510: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
d520: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
d530: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
d540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
d550: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
d560: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
d570: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
d580: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
d590: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
d5a0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
d5b0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
d5c0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
d5d0: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
d5e0: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
d5f0: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
d600: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
d610: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
d620: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
d630: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d640: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
d650: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
d660: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d670: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
d680: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
d690: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
d6a0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
d6b0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
d6c0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
d6d0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
d6e0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
d6f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d710: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d720: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d730: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
d740: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
d750: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
d760: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
d770: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
d780: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
d790: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
d7a0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
d7b0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
d7c0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
d7d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
d7e0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
d7f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
d800: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d810: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
d820: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d830: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
d840: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
d850: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
d860: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
d870: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
d880: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
d890: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
d8a0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
d8b0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
d8c0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
d8d0: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
d8e0: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
d8f0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
d900: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
d910: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d920: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
d930: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
d940: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
d950: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
d960: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
d970: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
d980: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
d990: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
d9a0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
d9b0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
d9c0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
d9d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d9e0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d9f0: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
da00: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
da10: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
da20: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
da30: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
da40: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
da50: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
da60: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
da70: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
da80: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
da90: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
daa0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
dab0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
dac0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
dad0: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
dae0: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
db00: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
db10: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
db20: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
db30: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
db40: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
db50: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
db60: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
db70: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
db80: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
db90: 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , i);.    pList 
dba0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
dbb0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
dbc0: 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29  pList, pSubExpr)
dbd0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
dbe0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
dbf0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69   pList->nExpr==i
dc00: 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20  First+i+1 );.   
dc10: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
dc20: 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  t->nExpr-1].zNam
dc30: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b  e = pColumns->a[
dc40: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
dc50: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
dc60: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Name = 0;.    }.
dc70: 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e    }..  if( !db->
dc80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
dc90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
dca0: 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70  LECT && ALWAYS(p
dcb0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
dcc0: 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70  Expr *pFirst = p
dcd0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
dce0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
dcf0: 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a  t( pFirst!=0 );.
dd00: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
dd10: 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  st->op==TK_SELEC
dd20: 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  T_COLUMN );.    
dd30: 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74   .    /* Store t
dd40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
dd50: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
dd60: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
dd70: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ted when.    ** 
dd80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
dd90: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
dda0: 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
ddb0: 20 70 46 69 72 73 74 2d 3e 65 58 3d 3d 45 58 5f   pFirst->eX==EX_
ddc0: 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 70 46 69 72  None );.    pFir
ddd0: 73 74 2d 3e 78 2e 70 52 69 67 68 74 20 3d 20 70  st->x.pRight = p
dde0: 45 78 70 72 3b 0a 20 20 20 20 70 46 69 72 73 74  Expr;.    pFirst
ddf0: 2d 3e 65 58 20 3d 20 45 58 5f 52 69 67 68 74 3b  ->eX = EX_Right;
de00: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  .    pExpr = 0;.
de10: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
de20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
de30: 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73   LHS in iTable s
de40: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68  o that we can ch
de50: 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  eck that.    ** 
de60: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
de70: 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69  sizes match duri
de80: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
de90: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  on. */.    pFirs
dea0: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c  t->iTable = pCol
deb0: 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a  umns->nId;.  }..
dec0: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
ded0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
dee0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
def0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  pr);.  sqlite3Id
df00: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
df10: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75  Columns);.  retu
df20: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
df30: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20  ** Set the sort 
df40: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61  order for the la
df50: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  st element on th
df60: 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74  e given ExprList
df70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
df80: 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
df90: 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a  Order(ExprList *
dfa0: 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65  p, int iSortOrde
dfb0: 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  r){.  if( p==0 )
dfc0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dfd0: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
dfe0: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
dff0: 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20  TE_SO_ASC>=0 && 
e000: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
e010: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e020: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66  >nExpr>0 );.  if
e030: 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29  ( iSortOrder<0 )
e040: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e050: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
e060: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
e070: 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72  _SO_ASC );.    r
e080: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e  eturn;.  }.  p->
e090: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
e0a0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53  rtOrder = (u8)iS
e0b0: 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ortOrder;.}../*.
e0c0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
e0d0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
e0e0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
e0f0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
e100: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
e110: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e120: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
e130: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
e140: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
e150: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
e160: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
e170: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
e180: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
e190: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
e1a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e1b0: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
e1c0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
e1d0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
e1e0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
e1f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
e200: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e210: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e220: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
e230: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
e240: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
e250: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
e260: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
e270: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
e280: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2a0: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
e2b0: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
e2c0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
e2d0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
e2e0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
e2f0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
e300: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
e310: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
e320: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
e330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
e340: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e350: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
e360: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
e370: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
e380: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
e390: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
e3a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
e3b0: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
e3c0: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
e3d0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
e3e0: 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69  ( dequote ) sqli
e3f0: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
e400: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
e410: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
e420: 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT ){.      sqli
e430: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
e440: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
e450: 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  )pItem->zName, p
e460: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
e470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e480: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
e490: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
e4a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
e4b0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
e4c0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
e4d0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
e4e0: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
e4f0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
e500: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
e510: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
e520: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
e530: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
e540: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
e550: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
e560: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
e570: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
e580: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
e590: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
e5a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e5b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e5c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
e5d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
e5e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
e5f0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
e600: 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  span. */.  const
e610: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20   char *zStart,  
e620: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74     /* Start of t
e630: 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e  he span */.  con
e640: 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20  st char *zEnd   
e650: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
e660: 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20  he span */.){.  
e670: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e680: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
e690: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
e6a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e6b0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
e6c0: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
e6d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e6e0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
e6f0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
e700: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
e710: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e730: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
e740: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
e750: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
e760: 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  DbSpanDup(db, zS
e770: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d  tart, zEnd);.  }
e780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
e790: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e7a0: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
e7b0: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
e7c0: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
e7d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
e7e0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
e7f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e800: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
e810: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
e820: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
e830: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
e840: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
e850: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
e860: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
e870: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
e880: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
e890: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
e8a0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
e8b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
e8c0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e8d0: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
e8e0: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
e8f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
e900: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e910: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e920: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
e930: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
e940: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e950: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
e960: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
e980: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
e990: 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e   exprListDeleteN
e9a0: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
e9b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e9c0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74  .  int i = pList
e9d0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63  ->nExpr;.  struc
e9e0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e9f0: 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d  *pItem =  pList-
ea00: 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  >a;.  assert( pL
ea10: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
ea20: 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
ea30: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ea40: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
ea50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ea60: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
ea70: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
ea80: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
ea90: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
eaa0: 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  em++;.  }while( 
eab0: 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74  --i>0 );.  sqlit
eac0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
ead0: 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  List);.}.void sq
eae0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
eaf0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
eb00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
eb10: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  ){.  if( pList )
eb20: 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e   exprListDeleteN
eb30: 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
eb40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
eb50: 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20  e bitwise-OR of 
eb60: 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66  all Expr.flags f
eb70: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76  ields in the giv
eb80: 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a  en.** ExprList..
eb90: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78  */.u32 sqlite3Ex
eba0: 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73  prListFlags(cons
ebb0: 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t ExprList *pLis
ebc0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  t){.  int i;.  u
ebd0: 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65  32 m = 0;.  asse
ebe0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
ebf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
ec00: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
ec10: 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  .     Expr *pExp
ec20: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
ec30: 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65  pExpr;.     asse
ec40: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
ec50: 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d       m |= pExpr-
ec60: 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65  >flags;.  }.  re
ec70: 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn m;.}../*.**
ec80: 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43   This is a SELEC
ec90: 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  T-node callback 
eca0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
ecb0: 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a  on walker that.*
ecc0: 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22  * always "fails"
ecd0: 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20  .  By "fail" in 
ece0: 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65  this case, we me
ecf0: 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65  an set.** pWalke
ed00: 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f  r->eCode to zero
ed10: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a   and abort..**.*
ed20: 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  * This callback 
ed30: 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69  is used by multi
ed40: 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ple expression w
ed50: 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  alkers..*/.int s
ed60: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
ed70: 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61  Fail(Walker *pWa
ed80: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
ed90: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
eda0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
edb0: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
edc0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74  eCode = 0;.  ret
edd0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
ede0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
edf0: 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
ee00: 69 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68  is an ID with th
ee10: 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72  e name "true" or
ee20: 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e   "false".** then
ee30: 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f   convert it into
ee40: 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45   an TK_TRUEFALSE
ee50: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e   term.  Return n
ee60: 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68  on-zero if.** th
ee70: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70  e conversion hap
ee80: 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20  pened, and zero 
ee90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
eea0: 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a  n is unaltered..
eeb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
eec0: 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28  prIdToTrueFalse(
eed0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
eee0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
eef0: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70  p==TK_ID || pExp
ef00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  r->op==TK_STRING
ef10: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
ef20: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
ef30: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22  u.zToken, "true"
ef40: 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74  )==0.   || sqlit
ef50: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ef60: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73  >u.zToken, "fals
ef70: 65 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e")==0.  ){.    
ef80: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54  pExpr->op = TK_T
ef90: 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65  RUEFALSE;.    re
efa0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
efb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
efc0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75   The argument mu
efd0: 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46  st be a TK_TRUEF
efe0: 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20  ALSE Expr node. 
eff0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74 20   Return 1 if it 
f000: 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30  is TRUE.** and 0
f010: 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e   if it is FALSE.
f020: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f030: 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f  xprTruthValue(co
f040: 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 29  nst Expr *pExpr)
f050: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  {.  assert( pExp
f060: 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41  r->op==TK_TRUEFA
f070: 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LSE );.  assert(
f080: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f090: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
f0a0: 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20  "true")==0.     
f0b0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49    || sqlite3StrI
f0c0: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
f0d0: 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20  ken,"false")==0 
f0e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
f0f0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d  r->u.zToken[4]==
f100: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0;.}.../*.** The
f110: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f120: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
f130: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65   used to check e
f140: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a  xpressions to.**
f150: 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65   see if they are
f160: 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20   "constant" for 
f170: 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  some definition 
f180: 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68  of constant.  Th
f190: 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64  e.** Walker.eCod
f1a0: 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e  e value determin
f1b0: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22  es the type of "
f1c0: 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65  constant" we are
f1d0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e   looking.** for.
f1e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
f1f0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
f200: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
f210: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
f220: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
f230: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f240: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
f250: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f260: 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20  eCode==1.**     
f270: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f280: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20  stantNotJoin()  
f290: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
f2a0: 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20  ->eCode==2.**   
f2b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54    sqlite3ExprIsT
f2c0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20  ableConstant()  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
f2e0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20  er->eCode==3.** 
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f300: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
f310: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61  ion()        pWa
f320: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
f330: 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  r 5.**.** In all
f340: 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
f350: 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72  backs set Walker
f360: 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f  .eCode=0 and abo
f370: 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  rt if the expres
f380: 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64  sion.** is found
f390: 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e   to not be a con
f3a0: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
f3b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f3c0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
f3d0: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
f3e0: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
f3f0: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
f400: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f410: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
f420: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73  r.eCode value is
f430: 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a   5 when parsing.
f440: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ** an existing s
f450: 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e  chema and 4 when
f460: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65   processing a ne
f470: 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  w statement.  A 
f480: 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
f490: 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72  er raises an err
f4a0: 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65  or for new state
f4b0: 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69  ments, but is si
f4c0: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64  lently converted
f4d0: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  .** to NULL for 
f4e0: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73  existing schemas
f4f0: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73  .  This allows s
f500: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f510: 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e  les that .** con
f520: 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72  tain a bound par
f530: 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74  ameter because t
f540: 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74  hey were generat
f550: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
f560: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
f570: 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62  e to be parsed b
f580: 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
f590: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f   of SQLite witho
f5a0: 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20  ut raising a.** 
f5b0: 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61  malformed schema
f5c0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
f5d0: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
f5e0: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
f5f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
f600: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
f610: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f620: 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65  is 2 then any te
f630: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
f640: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
f650: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
f660: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
f670: 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  s of a left join
f680: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
f690: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
f6a0: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
f6b0: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
f6c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
f6d0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20  er->eCode==2 && 
f6e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f6f0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f700: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
f710: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f720: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f730: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
f740: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f750: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
f760: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
f770: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
f780: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
f790: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
f7a0: 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
f7b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f7c0: 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75  4 or 5 or the fu
f7d0: 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20  nction has the. 
f7e0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e     ** SQLITE_FUN
f7f0: 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f  C_CONST flag. */
f800: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
f810: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
f820: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
f830: 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =4 || ExprHasPro
f840: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
f850: 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20  onstFunc) ){.   
f860: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
f870: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
f880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f890: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
f8a0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
f8b0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
f8c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f8d0: 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  _ID:.      /* Co
f8e0: 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20  nvert "true" or 
f8f0: 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46  "false" in a DEF
f900: 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f  AULT clause into
f910: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70   the.      ** ap
f920: 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55  propriate TK_TRU
f930: 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20  EFALSE operator 
f940: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
f950: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
f960: 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
f970: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f980: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
f990: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
f9a0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
f9b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
f9c0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
f9d0: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
f9e0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
f9f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fa00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
fa10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fa20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fa30: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
fa40: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
fa50: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
fa60: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
fa70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fa80: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
fa90: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
faa0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fab0: 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
fac0: 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ) && pWalker->eC
fad0: 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  ode!=2 ){.      
fae0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
faf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fb00: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
fb10: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
fb20: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
fb30: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
fb40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fb50: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fb60: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
fb70: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
fb80: 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
fb90: 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  L_ROW:.    case 
fba0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20  TK_REGISTER:.   
fbb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fbc0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
fbd0: 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TER );.      tes
fbe0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
fbf0: 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
fc00: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
fc10: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
fc20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fc30: 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54  bort;.    case T
fc40: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
fc50: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
fc60: 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20  Code==5 ){.     
fc70: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63     /* Silently c
fc80: 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72  onvert bound par
fc90: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70  ameters that app
fca0: 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52  ear inside of CR
fcb0: 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  EATE.        ** 
fcc0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20  statements into 
fcd0: 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73  a NULL when pars
fce0: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73  ing the CREATE s
fcf0: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75  tatement text ou
fd00: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
fd10: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
fd20: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
fd30: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
fd40: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  K_NULL;.      }e
fd50: 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  lse if( pWalker-
fd60: 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  >eCode==4 ){.   
fd70: 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20       /* A bound 
fd80: 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43  parameter in a C
fd90: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
fda0: 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
fdb0: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
fdc0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
fdd0: 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  ) causes an erro
fde0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61  r */.        pWa
fdf0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
fe00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fe10: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
fe20: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
fe30: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
fe40: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
fe50: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fe60: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
fe70: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
fe80: 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
fe90: 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74  llows */.      t
fea0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
feb0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
fec0: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
fed0: 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61  tWalkFail() disa
fee0: 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72  llows */.      r
fef0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
ff00: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
ff10: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
ff20: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
ff30: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
ff40: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
ff50: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
ff60: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
ff70: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
ff80: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
ff90: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
ffa0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ffb0: 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
ffc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ffd0: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ffe0: 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
fff0: 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
10000 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72  endif.  w.u.iCur
10010 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
10020 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10030 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10040 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
10050 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10060 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10070 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
10080 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
10090 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
100a0 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
100b0 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
100c0 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
100d0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
100e0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
100f0 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
10100 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10110 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
10120 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
10130 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
10140 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
10150 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
10160 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
10170 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10180 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
10190 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
101a0 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
101b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
101c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
101d0 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
101e0 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20  zero if.**.**   
101f0 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73 69  (1) the expressi
10200 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
10210 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65  and.**   (2) the
10220 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
10230 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
10240 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
10250 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
10260 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
10270 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65  d.**   (3) the e
10280 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
10290 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45  ot contain any E
102a0 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f  P_FixedCol TK_CO
102b0 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70  LUMN.**       op
102c0 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20 62  erands created b
102d0 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70  y the constant p
102e0 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d  ropagation optim
102f0 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  ization..**.** W
10300 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10310 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69   returns true, i
10320 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
10330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
10340 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  ** can be added 
10350 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  to the pParse->p
10360 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61  ConstExpr list a
10370 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  nd evaluated onc
10380 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72  e when.** the pr
10390 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
103a0 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65 65   starts up.  See
103b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
103c0 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74  AtInit()..*/.int
103d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
103e0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
103f0 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
10400 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
10410 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
10420 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
10430 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
10440 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
10450 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
10460 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
10470 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
10480 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
10490 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
104a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
104b0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
104c0 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
104d0 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
104e0 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
104f0 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
10500 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
10510 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10520 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
10530 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
10540 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
10550 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10560 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f   3, iCur);.}.../
10570 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
10580 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
10590 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  used by sqlite3E
105a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
105b0 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61  roupBy()..*/.sta
105c0 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
105d0 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
105e0 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  pBy(Walker *pWal
105f0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
10600 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
10610 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65  GroupBy = pWalke
10620 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20  r->u.pGroupBy;. 
10630 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68   int i;..  /* Ch
10640 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10650 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79  identical to any
10660 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20   GROUP BY term. 
10670 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a  If so, consider.
10680 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74    ** it constant
10690 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
106a0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
106b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
106c0 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79  pr *p = pGroupBy
106d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
106e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
106f0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
10700 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20  r, p, -1)<2 ){. 
10710 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10720 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
10730 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b  rNNCollSeq(pWalk
10740 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a  er->pParse, p);.
10750 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10760 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29  3IsBinary(pColl)
10770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10780 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
10790 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
107a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
107b0 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
107c0 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  lect. If so, con
107d0 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c  sider it variabl
107e0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  e. */.  if( pExp
107f0 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74  r->eX==EX_Select
10800 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
10810 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
10820 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
10830 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
10840 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
10850 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  nt(pWalker, pExp
10860 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
10870 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
10880 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20   tree passed as 
10890 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
108a0 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  nt. Return non-z
108b0 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ero.** if the ex
108c0 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74  pression consist
108d0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  s entirely of co
108e0 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65  nstants or copie
108f0 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69  s of terms .** i
10900 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20  n pGroupBy that 
10910 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49  sort with the BI
10920 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  NARY collation s
10930 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
10940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
10950 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
10960 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68   if a term of th
10970 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
10980 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74  can.** be promot
10990 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52  ed into the WHER
109a0 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  E clause.  In or
109b0 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70  der for such a p
109c0 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  romotion to work
109d0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
109e0 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  f the HAVING cla
109f0 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65  use term must be
10a00 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c   the same for al
10a10 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20  l members of.** 
10a20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20  a "group".  The 
10a30 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
10a40 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
10a50 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52  rm must be BINAR
10a60 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61  Y.** assumes tha
10a70 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61  t no other colla
10a80 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
10a90 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d  ll have a finer-
10aa0 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70  grained.** group
10ab0 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e  ing than binary.
10ac0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
10ad0 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69   (A=B COLLATE bi
10ae0 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a  nary) implies.**
10af0 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74   A=B in every ot
10b00 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  her collating se
10b10 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71  quence.  The req
10b20 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
10b30 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65  e.** GROUP BY be
10b40 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63   BINARY is stric
10b50 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ter than necessa
10b60 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c  ry.  It would al
10b70 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72  so work.** to pr
10b80 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61  omote HAVING cla
10b90 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  uses that use th
10ba0 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69  e same alternati
10bb0 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  ve collating.** 
10bc0 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
10bd0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62  GROUP BY term, b
10be0 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20  ut that is much 
10bf0 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c  harder to check,
10c00 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20  .** alternative 
10c10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10c20 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e  ces are uncommon
10c30 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e  , and this is on
10c40 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ly an.** optimiz
10c50 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b  ation, so we tak
10c60 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f  e the easy way o
10c70 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65  ut and simply re
10c80 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f  quire the.** GRO
10c90 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65  UP BY to use the
10ca0 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
10cb0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69  g sequence..*/.i
10cc0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10cd0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10ce0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
10cf0 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69   Expr *p, ExprLi
10d00 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20  st *pGroupBy){. 
10d10 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10d20 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10d30 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
10d40 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10d50 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78  OrGroupBy;.  w.x
10d60 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10d70 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70   0;.  w.u.pGroup
10d80 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
10d90 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
10da0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
10db0 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10dc0 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
10dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
10de0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10df0 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
10e00 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
10e10 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10e20 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
10e30 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
10e40 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
10e50 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
10e60 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
10e70 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
10e80 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
10e90 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
10ea0 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
10eb0 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
10ec0 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
10ed0 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
10ee0 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
10ef0 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
10f00 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
10f10 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
10f20 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10f30 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
10f40 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
10f50 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
10f60 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
10f70 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
10f80 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
10f90 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
10fa0 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
10fb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
10fc0 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
10fd0 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10fe0 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10ff0 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
11000 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
11010 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
11020 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
11030 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
11040 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
11050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11060 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
11070 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
11080 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
11090 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
110a0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
110b0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
110c0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
110d0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
110e0 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
110f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11100 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
11110 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
11120 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
11130 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
11140 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
11150 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
11160 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ode==0;.}.#endif
11170 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
11180 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
11190 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
111a0 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
111b0 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
111c0 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
111d0 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
111e0 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
111f0 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
11200 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
11210 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
11220 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
11230 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
11240 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
11250 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
11260 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
11270 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
11280 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
11290 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
112a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
112b0 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
112c0 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
112d0 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  rc = 0;.  if( p=
112e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
112f0 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
11300 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20  en following on 
11310 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  OOM */..  /* If 
11320 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
11330 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
11340 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
11350 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
11360 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
11370 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
11380 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
11390 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
113a0 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
113b0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
113c0 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
113d0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
113e0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
113f0 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
11400 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
11410 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
11420 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
11430 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
11440 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
11450 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
11460 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
11470 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
11480 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
11490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
114a0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
114b0 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
114c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
114d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
114e0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
114f0 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
11500 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11510 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
11520 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
11530 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
11540 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
11550 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
11560 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
11570 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
11580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11590 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
115a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
115b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
115c0 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
115d0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
115e0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
115f0 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
11600 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
11610 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
11620 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
11630 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
11640 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
11650 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
11660 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
11670 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
11680 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
11690 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
116a0 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
116b0 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
116c0 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
116d0 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
116e0 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
116f0 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
11700 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
11710 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
11720 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
11730 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
11740 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
11750 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
11760 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
11770 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
11780 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
11790 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
117a0 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
117b0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
117c0 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
117d0 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
117e0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
117f0 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
11800 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
11810 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
11820 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
11830 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
11840 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
11850 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
11860 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
11870 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11880 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11890 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
118a0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
118b0 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
118c0 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
118d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
118e0 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
118f0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
11900 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
11910 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11920 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
11930 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
11940 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74  OLUMN:.      ret
11950 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
11960 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
11970 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
11980 20 20 20 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20       p->pTab==0 
11990 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65  ||  /* Reference
119a0 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e   to column of in
119b0 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f  dex on expressio
119c0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
119d0 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30    (p->iColumn>=0
119e0 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
119f0 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
11a00 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64  tNull==0);.    d
11a10 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
11a20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
11a30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
11a40 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
11a50 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
11a60 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
11a70 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
11a80 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
11a90 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
11aa0 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
11ab0 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
11ac0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
11ad0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11ae0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
11af0 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
11b00 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
11b10 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
11b20 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
11b30 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
11b40 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
11b50 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
11b60 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
11b70 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
11b80 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
11b90 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
11ba0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
11bb0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
11bc0 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
11bd0 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
11be0 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
11bf0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
11c00 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
11c10 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11c20 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11c30 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
11c40 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
11c50 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11c60 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11c70 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11c80 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11c90 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11ca0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
11cb0 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
11cc0 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
11cd0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
11ce0 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
11cf0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
11d00 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11d10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11d20 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
11d30 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
11d40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11d50 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
11d60 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11d70 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
11d80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11d90 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
11da0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
11db0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
11dc0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
11dd0 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
11de0 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
11df0 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
11e00 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
11e10 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
11e20 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
11e30 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
11e40 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11e50 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11e60 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
11e70 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11e80 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
11e90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11ea0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
11eb0 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
11ec0 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
11ed0 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
11ee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
11ef0 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
11f00 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
11f10 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
11f20 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
11f30 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11f40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11f50 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
11f60 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11f70 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11f80 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
11f90 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
11fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73  ;.}../*.** pX is
11fb0 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49   the RHS of an I
11fc0 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
11fd0 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  pX is a SELECT s
11fe0 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61  tatement .** tha
11ff0 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66  t can be simplif
12000 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20  ied to a direct 
12010 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68  table access, th
12020 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  en return.** a p
12030 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45  ointer to the SE
12040 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
12050 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20   If pX is not a 
12060 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12070 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53  ,.** or if the S
12080 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12090 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69  needs to be mani
120a0 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72  fested into a tr
120b0 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  ansient.** table
120c0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  , then return NU
120d0 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  LL..*/.#ifndef S
120e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
120f0 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63  ERY.static Selec
12100 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f  t *isCandidateFo
12110 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29  rInOpt(Expr *pX)
12120 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
12130 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
12140 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
12150 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
12160 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
12170 28 20 70 58 2d 3e 65 58 21 3d 45 58 5f 53 65 6c  ( pX->eX!=EX_Sel
12180 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
12190 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75       /* Not a su
121a0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
121b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
121c0 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
121d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
121e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12200 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   Correlated subq
12210 20 2a 2f 0a 20 20 7d 0a 20 20 70 20 3d 20 70 58   */.  }.  p = pX
12220 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
12230 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
12240 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12250 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
12260 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
12270 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
12280 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
12290 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
122a0 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
122b0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
122c0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
122d0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
122e0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
122f0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
12300 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
12310 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
12320 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
12330 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
12340 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
12350 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
12360 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
12370 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
12380 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
12390 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
123a0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
123b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
123c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
123d0 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123f0 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
12400 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
12410 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
12420 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12430 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
12440 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
12450 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
12460 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
12470 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
12480 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
12490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
124a0 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
124b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
124c0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
124d0 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
124e0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
124f0 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
12500 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
12510 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
12520 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
12530 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
12540 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
12550 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
12560 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
12570 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
12580 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
12590 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
125a0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
125b0 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
125c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
125d0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
125e0 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
125f0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
12600 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
12610 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
12620 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
12630 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
12640 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
12650 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
12660 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
12670 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
12680 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
12690 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
126a0 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
126b0 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
126c0 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
126d0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
126e0 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
126f0 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
12700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12710 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
12720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12730 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
12740 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12750 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
12760 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
12770 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
12780 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
12790 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
127a0 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
127b0 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
127c0 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
127d0 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
127e0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
127f0 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
12800 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
12810 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
12820 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
12830 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
12840 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
12850 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
12860 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
12870 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
12880 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
12890 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
128a0 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
128b0 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
128c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
128e0 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
128f0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
12900 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12910 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
12920 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12930 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12940 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12950 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
12960 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
12970 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12980 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
12990 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
129a0 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
129b0 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
129c0 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
129d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
129e0 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
129f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12a00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12a10 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
12a20 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
12a30 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
12a40 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
12a50 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
12a60 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
12a70 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
12a80 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
12a90 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
12aa0 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
12ab0 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
12ac0 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
12ad0 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
12ae0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 65 58 21  assert( pIn->eX!
12af0 3d 45 58 5f 53 65 6c 65 63 74 20 29 3b 0a 20 20  =EX_Select );.  
12b00 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
12b10 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
12b20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
12b30 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
12b40 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
12b50 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
12b60 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
12b70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12b80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
12b90 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
12ba0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
12bb0 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
12bc0 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
12bd0 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
12be0 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
12bf0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12c00 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
12c10 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
12c20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
12c30 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
12c40 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
12c50 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
12c60 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
12c70 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
12c80 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
12c90 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
12ca0 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
12cb0 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
12cc0 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
12cd0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
12ce0 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
12cf0 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
12d00 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
12d10 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
12d20 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
12d30 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
12d40 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
12d50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12d60 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
12d70 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
12d80 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
12d90 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
12da0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
12db0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
12dc0 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
12dd0 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
12de0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
12df0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
12e00 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
12e10 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
12e20 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
12e30 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
12e40 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
12e50 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
12e60 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
12e70 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
12e80 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
12e90 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
12ea0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
12eb0 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
12ec0 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
12ed0 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
12ee0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
12ef0 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
12f00 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
12f10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12f20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
12f30 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
12f40 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
12f50 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
12f60 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
12f70 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
12f80 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
12f90 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
12fb0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
12fc0 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
12fd0 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
12fe0 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
12ff0 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
13000 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
13010 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
13020 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
13030 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
13040 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
13050 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e  n1>, <column2>..
13060 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  . FROM <table>.*
13070 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
13080 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13090 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
130a0 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
130b0 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
130c0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
130d0 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
130e0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
130f0 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
13100 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
13110 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
13120 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
13130 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
13140 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
13150 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
13160 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
13170 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
13180 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c  n, at a minimum,
13190 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
131a0 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
131b0 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
131c0 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74  DEX_LOOP but not
131d0 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c 61   both.  If inFla
131e0 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49  gs contains.** I
131f0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13200 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e  IP, then the gen
13210 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c  erated table wil
13220 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  l be used for a 
13230 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68  fast.** membersh
13240 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74  ip test.  When t
13250 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  he IN_INDEX_LOOP
13260 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
13270 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a   IN index will.*
13280 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f  * be used to loo
13290 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  p over all value
132a0 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20  s of the RHS of 
132b0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
132c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
132d0 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
132e0 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
132f0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
13300 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
13310 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
13320 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
13330 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
13340 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
13350 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
13360 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
13370 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73 20   created unless 
13380 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c  the selected col
13390 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74  umns are guarant
133a0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
133b0 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
133c0 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
133d0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
133e0 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61  Y or due to.** a
133f0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13400 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  nt or index..**.
13410 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
13420 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75  _MEMBERSHIP is u
13430 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
13440 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
13450 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
13460 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
13470 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65  ts) then an ephe
13480 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
13490 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
134a0 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73  ess <columns> is
134b0 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45   a single INTEGE
134c0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
134d0 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69  lumn or an .** i
134e0 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e  ndex can be foun
134f0 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
13500 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61  fied <columns> a
13510 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e  s its left-most.
13520 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
13530 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
13540 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
13550 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
13560 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
13570 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
13580 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
13590 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
135a0 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
135b0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
135c0 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
135d0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
135e0 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
135f0 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
13600 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
13610 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
13620 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
13630 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
13640 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
13650 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
13660 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
13670 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
13680 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
13690 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
136a0 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
136b0 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
136c0 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
136d0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
136e0 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
136f0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
13700 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
13710 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13720 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
13730 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
13740 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
13750 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
13760 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
13770 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
13780 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
13790 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
137a0 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
137b0 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
137c0 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
137d0 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
137e0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
137f0 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
13800 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
13810 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
13820 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
13830 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
13840 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
13850 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
13860 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
13870 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
13880 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
13890 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
138a0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
138b0 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
138c0 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
138d0 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
138e0 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
138f0 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
13900 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
13910 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
13920 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
13930 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
13940 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
13950 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
13960 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
13970 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
13980 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
13990 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72   aiMap parameter
139a0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
139b0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
139c0 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69  n array containi
139d0 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e  ng.** one elemen
139e0 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  t for each colum
139f0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
13a00 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13a10 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a  nt on the RHS.**
13a20 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
13a30 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27  operator. The i'
13a40 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
13a50 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
13a60 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f  ed with the.** o
13a70 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64  ffset of the ind
13a80 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ex column that m
13a90 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20  atches the i'th 
13aa0 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
13ab0 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  by the.** SELECT
13ac0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
13ad0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13ae0 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e   and selected in
13af0 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  dex are:.**.**  
13b00 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c   (?,?,?) IN (SEL
13b10 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
13b20 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45   t1).**   CREATE
13b30 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
13b40 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20  b, c, a);.**.** 
13b50 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20  then aiMap[] is 
13b60 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b  populated with {
13b70 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66  2, 0, 1}..*/.#if
13b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b90 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
13ba0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
13bb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13bc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
13bd0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13be0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c  t */.  Expr *pX,
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
13c10 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f  and side (RHS) o
13c20 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13c30 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61  r */.  u32 inFla
13c40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
13c50 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f    /* IN_INDEX_LO
13c60 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c  OP, _MEMBERSHIP,
13c70 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b   and/or _NOOP_OK
13c80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73   */.  int *prRhs
13c90 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  HasNull,        
13ca0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
13cb0 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73  ding NULL status
13cc0 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a  .  See notes */.
13cd0 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20    int *aiMap    
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13cf0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64  Mapping from Ind
13d00 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53  ex fields to RHS
13d10 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
13d20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
13d50 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
13d60 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
13d70 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
13da0 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
13db0 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
13dc0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
13dd0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
13de0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
13df0 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
13e00 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
13e10 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
13e20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13e30 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
13e40 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
13e50 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
13e60 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
13e70 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
13e80 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
13e90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
13ea0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
13eb0 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
13ec0 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
13ed0 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
13ee0 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20    /* If the RHS 
13ef0 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  of this IN(...) 
13f00 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45  operator is a SE
13f10 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20  LECT, and if it 
13f20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68  matters .  ** wh
13f30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13f40 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63   SELECT result c
13f50 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
13f60 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68  ues, check wheth
13f70 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e  er.  ** or not N
13f80 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ULL is actually 
13f90 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79  possible (it may
13fa0 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61   not be, for exa
13fb0 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20  mple, due .  ** 
13fc0 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  to NOT NULL cons
13fd0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73  traints in the s
13fe0 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55  chema). If no NU
13ff0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  LL values are po
14000 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74  ssible,.  ** set
14010 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f   prRhsHasNull to
14020 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e   0 before contin
14030 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20  uing.  */.  if( 
14040 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
14050 70 58 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63  pX->eX==EX_Selec
14060 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
14070 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
14080 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
14090 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
140a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
140b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
140c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
140d0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
140e0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
140f0 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
14100 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
14110 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
14120 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
14130 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
14140 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
14150 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
14160 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
14170 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
14180 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
14190 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
141a0 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
141b0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
141c0 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
141d0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
141e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
141f0 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
14200 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
14210 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
14220 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14230 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
14240 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
14250 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
14260 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
14290 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
142a0 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
142d0 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
142e0 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
142f0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
14300 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
14310 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
14320 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
14330 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
14340 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
14350 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
14360 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
14370 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
14380 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
14390 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
143a0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
143b0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
143c0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
143d0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
143e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143f0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
14400 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
14410 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
14420 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
14430 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
14440 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
14450 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
14460 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
14470 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
14480 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14490 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
144a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
144b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
144c0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
144d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
144e0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
144f0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
14500 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
14510 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
14520 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
14530 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
14540 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
14550 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
14560 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
14570 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
14580 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
14590 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
145a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
145b0 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
145c0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
145d0 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
145e0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
145f0 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
14600 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
14620 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
14630 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
14640 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
14650 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
14660 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
14670 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
14680 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
14690 20 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49              "USI
146a0 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20  NG ROWID SEARCH 
146b0 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20  ON TABLE %s FOR 
146c0 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61  IN-OPERATOR",pTa
146d0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
146e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
146f0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
14700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14710 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14740 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
14750 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
14760 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  y_ok = 1;.      
14770 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a  int i;..      /*
14780 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
14790 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
147a0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
147b0 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20  rform each .    
147c0 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
147d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
147e0 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65  he affinity of e
147f0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  ach column in ta
14800 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ble.      ** on 
14810 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
14820 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
14830 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  it not, it is no
14840 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20  t possible to.  
14850 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69      ** use any i
14860 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20  ndex of the RHS 
14870 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
14880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
14890 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  r && affinity_ok
148a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
148b0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
148c0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
148d0 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
148e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , i);.        in
148f0 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  t iCol = pEList-
14900 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[i].pExpr->iCo
14910 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lumn;.        ch
14920 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69  ar idxaff = sqli
14930 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
14940 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c  finity(pTab,iCol
14950 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20  ); /* RHS table 
14960 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
14970 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33  cmpaff = sqlite3
14980 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14990 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20  pLhs, idxaff);. 
149a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
149b0 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
149c0 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
149d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
149e0 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
149f0 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
14a00 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20   switch( cmpaff 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
14a20 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
14a30 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  B:.            b
14a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14a50 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
14a60 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20  TEXT:.          
14a70 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70    /* sqlite3Comp
14a80 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e  areAffinity() on
14a90 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20  ly returns TEXT 
14aa0 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  if one side or t
14ab0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
14ac0 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61  * other has no a
14ad0 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
14ae0 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45  other side is TE
14af0 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20  XT.  Hence,.    
14b00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f          ** the o
14b10 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61  nly way for cmpa
14b20 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73  ff to be TEXT is
14b30 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62   for idxaff to b
14b40 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20  e TEXT.         
14b50 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68     ** and for th
14b60 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48  e term on the LH
14b70 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68  S of the IN to h
14b80 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  ave no affinity.
14b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14ba0 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d  assert( idxaff==
14bb0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14bd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14be0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
14bf0 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b       affinity_ok
14c00 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65   = sqlite3IsNume
14c10 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61  ricAffinity(idxa
14c20 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
14c30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
14c40 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b  ( affinity_ok ){
14c50 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
14c60 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
14c70 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69  ng index that wi
14c80 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73  ll work for this
14c90 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
14ca0 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
14cb0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
14cc0 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b  Idx && eType==0;
14cd0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
14ce0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69  t){.          Bi
14cf0 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20  tmask colUsed;  
14d00 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f      /* Columns o
14d10 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
14d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69   */.          Bi
14d30 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20  tmask mCol;     
14d40 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
14d50 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
14d60 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
14d70 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
14d80 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  n<nExpr ) contin
14d90 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
14da0 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
14db0 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
14dc0 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
14dd0 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
14de0 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
14df0 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
14e00 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
14e10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
14e20 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
14e30 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
14e40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e50 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14e60 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
14e70 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14e80 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
14e90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
14ea0 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
14eb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14ec0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
14ed0 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
14ee0 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
14ef0 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
14f00 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
14f10 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
14f20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
14f30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
14f40 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
14f50 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
14f60 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
14f70 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
14f80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
14f90 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
14fa0 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
14fb0 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
14fc0 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
14fd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
14fe0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
15000 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
15010 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
15020 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
15030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
15040 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
15050 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
15060 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
15070 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
15080 65 33 43 6f 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c  e3ComparisonColl
15090 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
150a0 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
150b0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20       int j;.  . 
150c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
150d0 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52  t( pReq!=0 || pR
150e0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
150f0 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d  ROWID || pParse-
15100 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
15110 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
15120 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
15130 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
15140 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
15150 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
15160 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15170 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15180 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
15190 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
151a0 20 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26     if( pReq!=0 &
151b0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
151c0 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49  (pReq->zName, pI
151d0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  dx->azColl[j])!=
151e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
151f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
15220 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
15230 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
15240 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65  ( j==nExpr ) bre
15250 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
15260 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a  mCol = MASKBIT(j
15270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15280 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65  f( mCol & colUse
15290 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61  d ) break; /* Ea
152a0 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f  ch column used o
152b0 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20  nly once */.    
152c0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
152d0 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20  |= mCol;.       
152e0 20 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29       if( aiMap )
152f0 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20   aiMap[i] = j;. 
15300 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
15310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15320 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55  i==nExpr || colU
15330 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed!=(MASKBIT(nE
15340 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20  xpr)-1) );.     
15350 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64       if( colUsed
15360 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  ==(MASKBIT(nExpr
15370 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )-1) ){.        
15380 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
15390 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
153a0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e  hat means the in
153b0 64 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62  dex pIdx is usab
153c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
153d0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
153e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
153f0 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
15400 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15410 20 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69            Explai
15420 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15430 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45       "USING INDE
15460 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
15470 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
15480 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
15490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
154a0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
154b0 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
154c0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
154d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
154e0 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
154f0 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
15500 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
15510 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
15520 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
15530 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
15540 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
15550 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
15560 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
15570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
15580 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
15590 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
155a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
155b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
155c0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
155d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
155e0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
155f0 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
15600 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
15610 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
15640 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
15650 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
15660 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
15670 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
15680 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
15690 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
156a0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
156b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
156c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
156d0 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
15700 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
15710 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
15730 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15750 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15760 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
15770 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
15780 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
15790 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
157a0 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
157b0 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
157c0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
157d0 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
157e0 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
157f0 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
15800 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
15810 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
15820 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
15830 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
15840 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
15850 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
15860 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
15870 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
15880 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
15890 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
158a0 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
158b0 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
158c0 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
158d0 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
158e0 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
158f0 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
15900 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
15910 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
15920 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15930 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
15940 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
15950 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
15960 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
15970 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
15980 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
15990 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 21 3d 30  NDEX_NOOP_OK)!=0
159a0 0a 20 20 20 26 26 20 70 58 2d 3e 65 58 3d 3d 45  .   && pX->eX==E
159b0 58 5f 4c 69 73 74 0a 20 20 20 26 26 20 28 21 73  X_List.   && (!s
159c0 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
159d0 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
159e0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
159f0 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
15a00 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
15a10 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
15a20 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
15a30 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
15a40 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
15a50 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
15a60 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
15a70 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
15a80 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
15a90 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
15aa0 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
15ab0 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
15ac0 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
15ad0 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
15ae0 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
15af0 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
15b00 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
15b10 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
15b20 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
15b30 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
15b40 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15b50 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
15b60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
15b70 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
15b80 20 26 26 20 70 58 2d 3e 65 58 3d 3d 45 58 5f 4c   && pX->eX==EX_L
15b90 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ist ){.        e
15ba0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15bb0 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
15bc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
15bd0 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
15be0 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
15bf0 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
15c00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
15c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15c20 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
15c30 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
15c40 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
15c50 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
15c60 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
15c70 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
15c80 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
15c90 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
15ca0 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
15cb0 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26 26  ..  if( aiMap &&
15cc0 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
15cd0 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54  _INDEX_ASC && eT
15ce0 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
15cf0 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
15d00 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
15d10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
15d20 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66  torSize(pX->pLef
15d30 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
15d40 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70   i<n; i++) aiMap
15d50 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  [i] = i;.  }.  r
15d60 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
15d70 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
15d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15d90 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  ERY./*.** Argume
15da0 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28  nt pExpr is an (
15db0 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29  ?, ?...) IN(...)
15dc0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69   expression. Thi
15dd0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  s .** function a
15de0 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
15df0 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  urns a nul-termi
15e00 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
15e10 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
15e20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65  affinities to be
15e30 20 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63   used for each c
15e40 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d  olumn of the com
15e50 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  parison..**.** I
15e60 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
15e70 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
15e80 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20  aller to ensure 
15e90 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
15ea0 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65  d.** string is e
15eb0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
15ec0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
15ed0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15ee0 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66   char *exprINAff
15ef0 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
15f00 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15f10 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  ){.  Expr *pLeft
15f20 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
15f30 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71  .  int nVal = sq
15f40 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
15f50 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65  ize(pLeft);.  Se
15f60 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
15f70 28 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53  (pExpr->eX==EX_S
15f80 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
15f90 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
15fa0 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
15fb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
15fc0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
15fd0 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
15fe0 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
15ff0 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69  db, nVal+1);.  i
16000 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
16010 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
16020 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
16030 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20  .      Expr *pA 
16040 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
16050 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
16060 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
16070 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
16080 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
16090 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
160a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
160b0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
160c0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
160d0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
160e0 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
160f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16100 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
16110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16120 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
16130 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
16140 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
16150 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16160 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
16170 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
16180 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
16190 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
161a0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
161b0 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
161c0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
161d0 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
161e0 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
161f0 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
16200 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
16210 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
16220 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
16230 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
16240 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
16250 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
16260 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
16270 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
16280 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
16290 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
162a0 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
162b0 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
162c0 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
162d0 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
162e0 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f  pExpr is a vecto
162f0 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
16300 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78  used in a contex
16310 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73  t where.** it is
16320 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
16330 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  If pExpr is a su
16340 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c  b-select vector,
16350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a   this routine .*
16360 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73  * loads the Pars
16370 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20  e object with a 
16380 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
16390 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
163a0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
163b0 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
163c0 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f  ected 1".**.** O
163d0 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  r, if it is a re
163e0 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63  gular scalar vec
163f0 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f  tor:.**.**   "ro
16400 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
16410 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
16420 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
16430 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
16440 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23   Expr *pExpr){.#
16450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16460 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
16470 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  ( pExpr->eX==EX_
16480 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16490 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
164a0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ror(pParse, pExp
164b0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
164c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
164d0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
164e0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
164f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16500 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
16510 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ed");.  }.}../*.
16520 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16530 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
16540 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
16550 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
16560 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
16570 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
16580 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
16590 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
165a0 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
165b0 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
165c0 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
165d0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
165e0 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
165f0 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
16600 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
16610 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
16620 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
16630 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16640 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
16650 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
16660 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
16670 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
16680 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
16690 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
166a0 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
166b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
166c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
166d0 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
166e0 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
166f0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16700 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
16710 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
16720 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
16730 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
16740 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
16750 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
16760 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
16770 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
16780 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
16790 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
167a0 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
167b0 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
167c0 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
167d0 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
167e0 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
167f0 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
16800 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
16810 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
16820 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
16830 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
16840 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
16850 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
16860 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
16870 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
16880 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
16890 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
168a0 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
168b0 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
168c0 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20  s NULLs..** All 
168d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
168e0 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20  s is initialize 
168f0 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76  the register giv
16900 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75  en by rMayHaveNu
16910 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20  ll.** to NULL.  
16920 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73  Calling routines
16930 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20   will take care 
16940 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  of changing this
16950 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c   register.** val
16960 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  ue to non-NULL i
16970 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
16980 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  L-free..**.** Fo
16990 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
169a0 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
169b0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
169c0 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
169d0 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
169e0 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
169f0 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73   SELECT, the res
16a00 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
16a10 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a   a contiguous.**
16a20 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
16a30 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75  ers and the retu
16a40 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
16a50 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20  register of the 
16a60 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73  left-most.** res
16a70 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74  ult column.  Ret
16a80 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65  urn 0 for IN ope
16a90 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
16aa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
16ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16ac0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
16ad0 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
16ae0 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
16af0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16b00 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16b10 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
16b20 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
16b30 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
16b40 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
16b50 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
16b60 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20   rHasNullFlag,  
16b70 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
16b80 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
16b90 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
16ba0 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
16bb0 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
16bc0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
16bd0 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
16be0 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
16bf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49  */.){.  int jmpI
16c00 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20  fDynamic = -1;  
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
16c30 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
16c40 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
16c70 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
16c80 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
16c90 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
16ca0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16cb0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
16cc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16cd0 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
16ce0 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53  n of the IN/EXIS
16cf0 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
16d00 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
16d10 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
16d20 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
16d30 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
16d40 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
16d50 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
16d60 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16d70 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
16d80 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
16d90 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16da0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
16db0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
16dc0 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
16dd0 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
16de0 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
16df0 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
16e00 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
16e10 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
16e20 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
16e30 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
16e40 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
16e50 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
16e60 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
16e70 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
16e80 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
16e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
16ea0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16eb0 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
16ec0 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79  ) ){.    jmpIfDy
16ed0 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56  namic = sqlite3V
16ee0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
16ef0 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
16f00 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 73  age(v);.  }..  s
16f10 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
16f20 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
16f30 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
16f40 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
16f50 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16f60 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
16f70 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
16f80 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
16f90 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16fa0 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
16fb0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
16fc0 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
16fd0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16fe0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
16ff0 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
17000 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
17030 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20  ctor pLeft */.  
17040 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20      .      nVal 
17050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
17060 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
17070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
17080 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d  sRowid || nVal==
17090 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
170a0 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
170b0 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
170c0 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
170d0 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
170e0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
170f0 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
17100 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
17110 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
17120 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
17130 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20  lled with index 
17140 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
17150 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  g the results fr
17160 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  om the .      **
17170 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
17180 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
17190 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
171a0 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
171b0 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
171c0 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
171d0 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
171e0 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
171f0 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
17200 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
17210 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
17220 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
17230 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
17240 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
17250 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
17260 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
17270 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
17280 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
17290 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
172a0 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
172b0 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
172c0 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
172d0 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
172e0 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
172f0 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
17300 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
17310 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
17320 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
17330 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
17340 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
17350 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
17360 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
17370 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
17380 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17390 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
173a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
173b0 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
173c0 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77  ->iTable, (isRow
173d0 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20  id?0:nVal));.   
173e0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
173f0 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
17400 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17410 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
17420 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  , 1);..      ass
17430 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
17440 45 58 5f 53 65 6c 65 63 74 20 7c 7c 20 70 45 78  EX_Select || pEx
17450 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20  pr->eX==EX_List 
17460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
17470 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63  pr->eX==EX_Selec
17480 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
17490 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
174a0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
174b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
174c0 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
174d0 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
174e0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
174f0 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
17500 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
17510 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
17520 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
17530 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
17540 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
17550 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78  t *pSelect = pEx
17560 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
17570 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
17580 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  *pEList = pSelec
17590 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t->pEList;..    
175a0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
175b0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
175c0 20 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52   "%sLIST SUBQUER
175d0 59 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y",.            
175e0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f  jmpIfDynamic>=0?
175f0 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22  "":"CORRELATED "
17600 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20  .        ));.   
17610 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
17620 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
17630 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
17640 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
17650 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
17660 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
17670 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69       ** error wi
17680 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75  ll have been cau
17690 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20  ght long before 
176a0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
176b0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
176c0 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73  if( ALWAYS(pELis
176d0 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20  t->nExpr==nVal) 
176e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
176f0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
17700 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
17710 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17720 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17730 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
17740 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
17750 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41           dest.zA
17760 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41  ffSdst = exprINA
17770 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
17780 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
17790 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
177a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
177b0 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
177c0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
177d0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
177e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
177f0 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
17800 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
17810 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
17820 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
17830 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
17840 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17850 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
17860 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17870 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
17880 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
17890 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
178a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
178b0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
178c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
178d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
178e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
178f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17900 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
17910 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
17920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
17930 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
17940 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
17950 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
17960 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
17970 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17980 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
17990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
179a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
179b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
179c0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
179d0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
179e0 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
179f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17a00 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
17a10 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
17a20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
17a30 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
17a40 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
17a50 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
17a60 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  l[i] = sqlite3Co
17a70 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c 53 65 71 28  mparisonCollSeq(
17a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a90 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
17aa0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
17ab0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
17ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17ad0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
17ae0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
17af0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
17b00 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
17b10 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
17b20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
17b30 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
17b40 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
17b50 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
17b60 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
17b70 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
17b80 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
17b90 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
17ba0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
17bb0 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
17bc0 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
17bd0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
17be0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
17bf0 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
17c00 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
17c10 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
17c20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
17c30 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
17c40 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
17c50 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69         char affi
17c60 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
17c70 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
17c80 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
17c90 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  N */.        int
17ca0 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
17cb0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
17cc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17cd0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
17ce0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17cf0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
17d00 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
17d10 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
17d20 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17d30 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  y(pLeft);.      
17d40 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
17d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
17d60 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
17d70 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
17d80 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
17d90 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
17da0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
17db0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
17dc0 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
17dd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   );.          pK
17de0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
17df0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17e00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17e10 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17e20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17e30 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
17e40 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
17e50 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
17e60 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
17e70 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17e80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17e90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
17ea0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17eb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
17ec0 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56  Rowid ) sqlite3V
17ed0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17ee0 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30 2c 20  Blob, 0, r2, 0, 
17ef0 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
17f00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
17f10 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
17f20 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
17f30 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
17f40 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
17f50 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
17f60 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
17f70 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
17f80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
17f90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
17fa0 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
17fb0 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
17fc0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
17fd0 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
17fe0 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
17ff0 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
18000 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
18010 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
18020 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
18030 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
18040 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
18050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
18060 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
18070 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
18080 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
18090 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
180a0 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
180b0 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
180c0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
180d0 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
180e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
180f0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
18100 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
18110 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
18120 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
18130 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
18140 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
18150 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
18160 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
18170 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
18180 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
18190 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
181a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
181b0 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
181c0 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
181d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
181e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
181f0 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
18200 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
18210 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
18220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18230 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
18240 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18250 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
18260 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
18270 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
18280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
182a0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
182b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
182e0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
18300 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18310 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18320 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18330 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
18340 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
18350 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
18360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18380 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
18390 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
183a0 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
183b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
183c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
183d0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
183e0 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
183f0 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29  able, r2, r3, 1)
18400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
18410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
18430 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18440 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
18450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18460 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18470 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
18480 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b    }.      if( pK
18490 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
184a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
184b0 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
184c0 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  void *)pKeyInfo,
184d0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
184e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
184f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
18500 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
18510 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
18520 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
18530 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33  .      /* Case 3
18540 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e  :    (SELECT ...
18550 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20   FROM ...).     
18560 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45   **     or:    E
18570 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e  XISTS(SELECT ...
18580 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20   FROM ...).     
18590 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
185a0 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72   a SELECT, gener
185b0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
185c0 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  the values for a
185d0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  ll columns of.  
185e0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
185f0 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
18600 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
18610 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
18620 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a  ndex of.      **
18630 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
18640 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ter..      **.  
18650 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
18660 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
18670 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  te an integer 0 
18680 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
18690 31 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20  1 (exists).     
186a0 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
186b0 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
186c0 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
186d0 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ber..      **.  
186e0 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63      ** In both c
186f0 61 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20  ases, the query 
18700 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  is augmented wit
18710 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e  h "LIMIT 1".  An
18720 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65  y .      ** pree
18730 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73  xisting limit is
18740 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c   discarded in pl
18750 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c  ace of the new L
18760 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f  IMIT 1..      */
18770 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
18780 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
187b0 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
187c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
187d0 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
187e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
187f0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
18800 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20  LECT result */. 
18810 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20       int nReg;  
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18840 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
18850 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ate */.      Exp
18860 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20  r *pLimit;      
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20     /* New limit 
18890 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20  expression */.. 
188a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
188b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
188c0 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
188d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
188e0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
188f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18900 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
18910 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
18920 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
18930 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18940 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20  ->eX==EX_Select 
18950 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  );..      pSel =
18960 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
18970 74 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  t;.      Explain
18980 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
18990 65 2c 20 31 2c 20 22 25 73 53 43 41 4c 41 52 20  e, 1, "%sSCALAR 
189a0 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20  SUBQUERY",.     
189b0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
189c0 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
189d0 4c 41 54 45 44 20 22 29 29 3b 0a 20 20 20 20 20  LATED "));.     
189e0 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f   nReg = pExpr->o
189f0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70  p==TK_SELECT ? p
18a00 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sel->pEList->nEx
18a10 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71  pr : 1;.      sq
18a20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
18a30 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50  nit(&dest, 0, pP
18a40 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
18a50 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
18a60 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  m += nReg;.     
18a70 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
18a80 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
18a90 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
18aa0 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
18ab0 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
18ac0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
18ad0 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74        dest.nSdst
18ae0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20   = nReg;.       
18af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18b00 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
18b10 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
18b20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65  dest.iSDParm+nRe
18b30 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  g-1);.        Vd
18b40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
18b50 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
18b60 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
18b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
18b80 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
18b90 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
18ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18bb0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
18bc0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
18bd0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
18be0 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
18bf0 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
18c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
18c10 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
18c20 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
18c30 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  >db, TK_INTEGER,
18c40 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
18c50 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  s[1], 0);.      
18c60 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  if( pSel->pLimit
18c70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18c80 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
18c90 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
18ca0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a  pLimit->pLeft);.
18cb0 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c          pSel->pL
18cc0 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  imit->pLeft = pL
18cd0 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  imit;.      }els
18ce0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d  e{.        pSel-
18cf0 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
18d00 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
18d10 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c  K_LIMIT, pLimit,
18d20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
18d30 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
18d40 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
18d50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
18d60 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
18d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
18d80 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
18d90 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
18da0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
18db0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
18dc0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
18dd0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72  educe);.      br
18de0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
18df0 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c    if( rHasNullFl
18e00 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
18e10 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
18e20 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  v, pExpr->iTable
18e30 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b  , rHasNullFlag);
18e40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49  .  }..  if( jmpI
18e50 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20  fDynamic>=0 ){. 
18e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
18e70 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44  mpHere(v, jmpIfD
18e80 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 0a 20 20  ynamic);.  }..  
18e90 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
18ea0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18eb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
18ec0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18ed0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
18ee0 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73  *.** Expr pIn is
18ef0 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72   an IN(...) expr
18f00 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ession. This fun
18f10 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
18f20 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  t the .** sub-se
18f30 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20  lect on the RHS 
18f40 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72  of the IN() oper
18f50 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d  ator has the sam
18f60 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
18f70 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76  columns as the v
18f80 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
18f90 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53  . Or, if the RHS
18fa0 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20   of the IN() is 
18fb0 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75  not .** a sub-qu
18fc0 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48  ery, that the LH
18fd0 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66  S is a vector of
18fe0 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20   size 1..*/.int 
18ff0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
19000 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  IN(Parse *pParse
19010 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  , Expr *pIn){.  
19020 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  int nVector = sq
19030 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
19040 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  ize(pIn->pLeft);
19050 0a 20 20 69 66 28 20 70 49 6e 2d 3e 65 58 3d 3d  .  if( pIn->eX==
19060 45 58 5f 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  EX_Select ){.   
19070 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49   if( nVector!=pI
19080 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
19090 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
190a0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
190b0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
190c0 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  e, pIn->x.pSelec
190d0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
190e0 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
190f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19100 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  }.  }else if( nV
19110 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20  ector!=1 ){.    
19120 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
19130 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49  orMsg(pParse, pI
19140 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72  n->pLeft);.    r
19150 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
19160 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
19170 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
19180 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19190 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
191a0 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
191b0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
191c0 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
191d0 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
191e0 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
191f0 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
19200 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
19210 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
19220 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70  ar or vector exp
19230 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a  ression.  The .*
19240 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
19250 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72  e (RHS) is an ar
19260 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
19270 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65  ore scalar value
19280 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75  s, or a.** subqu
19290 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53  ery.  If the RHS
192a0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
192b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
192c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  sult columns mus
192d0 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e  t.** match the n
192e0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
192f0 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f   in the vector o
19300 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74  n the LHS.  If t
19310 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c  he RHS is.** a l
19320 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74  ist of values, t
19330 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61  he LHS must be a
19340 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20   scalar. .**.** 
19350 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
19360 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
19370 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74  HS value is cont
19380 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
19390 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73   RHS..** The res
193a0 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20  ult is false if 
193b0 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e  the LHS is defin
193c0 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65  itely not in the
193d0 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72   RHS.  The .** r
193e0 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
193f0 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
19400 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20   the LHS in the 
19410 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a  RHS cannot be .*
19420 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65  * determined due
19430 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a   to NULLs..**.**
19440 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
19450 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
19460 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
19470 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
19480 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
19490 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
194a0 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
194b0 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
194c0 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
194d0 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
194e0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
194f0 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
19500 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
19510 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
19520 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
19530 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
19540 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53  through..**.** S
19550 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ee the separate 
19560 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64  in-operator.md d
19570 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c  ocumentation fil
19580 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  e in the canonic
19590 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75  al.** SQLite sou
195a0 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64  rce tree for add
195b0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
195c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
195d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
195e0 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
195f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
19600 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
19610 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
19620 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
19630 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
19640 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
19650 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
19660 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
19670 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19680 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
19690 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
196a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
196b0 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
196c0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
196d0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
196e0 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
196f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
19700 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
19710 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
19720 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
19730 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
19740 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ues */.  int eTy
19750 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
19760 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
19770 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b  S */.  int rLhs;
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19790 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64  Register(s) hold
197a0 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75  ing the LHS valu
197b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  es */.  int rLhs
197c0 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Orig;         /*
197d0 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f   LHS values prio
197e0 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20  r to reordering 
197f0 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20  by aiMap[] */.  
19800 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
19810 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
19820 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
19830 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ction */.  int *
19840 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  aiMap = 0;      
19850 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63   /* Map from vec
19860 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64  tor field to ind
19870 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ex column */.  c
19880 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20  har *zAff = 0;  
19890 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
198a0 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70   string for comp
198b0 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  arisons */.  int
198c0 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nVector;       
198d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
198e0 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49  ctors for this I
198f0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
19900 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20  int iDummy;     
19910 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70        /* Dummy p
19920 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72  arameter to expr
19930 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a  CodeVector() */.
19940 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
19950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
19960 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
19970 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19990 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* loop counter
199a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
199b0 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  ep2;        /* W
199c0 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65  here to jump whe
199d0 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20  n NULLs seen in 
199e0 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20  step 2 */.  int 
199f0 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20  destStep6 = 0;  
19a00 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f    /* Start of co
19a10 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f  de for Step 6 */
19a20 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68  .  int addrTruth
19a30 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  Op;      /* Addr
19a40 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68  ess of opcode th
19a50 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  at determines th
19a60 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  e IN is true */.
19a70 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c    int destNotNul
19a80 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  l;      /* Jump 
19a90 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72  here if a compar
19aa0 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65  ison is not true
19ab0 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20   in step 6 */.  
19ac0 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
19ad0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
19ae0 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20  the step-6 loop 
19af0 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70  */ ..  pLeft = p
19b00 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
19b10 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
19b20 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
19b30 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
19b40 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
19b50 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
19b60 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
19b70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
19b80 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
19b90 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
19ba0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
19bb0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
19bc0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
19bd0 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
19be0 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
19bf0 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
19c00 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
19c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
19c20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
19c30 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
19c40 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
19c50 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
19c60 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
19c70 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
19c80 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
19c90 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
19ca0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
19cb0 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63  ble opened ith c
19cc0 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61  ursor pExpr->iTa
19cd0 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ble .  ** contai
19ce0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
19cf0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
19d00 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
19d10 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
19d20 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
19d30 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
19d40 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
19d50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19d60 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
19d70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
19d80 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
19d90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
19da0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19db0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
19dc0 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
19dd0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
19de0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
19df0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
19e20 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
19e30 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
19e60 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
19e70 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
19e80 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61  ll, aiMap);..  a
19e90 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
19ea0 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
19eb0 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
19ec0 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
19ed0 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19ee0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
19ef0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19f00 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
19f10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19f20 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
19f30 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
19f40 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
19f50 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
19f60 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
19f70 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
19f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19f90 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19fa0 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
19fb0 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
19fc0 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
19fd0 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
19fe0 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
19ff0 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
1a000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
1a010 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
1a020 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
1a030 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
1a040 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
1a050 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
1a060 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
1a070 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
1a080 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
1a090 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
1a0a0 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
1a0b0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1a0c0 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
1a0d0 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
1a0e0 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
1a0f0 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
1a100 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
1a110 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
1a120 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
1a130 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
1a140 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
1a150 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
1a160 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
1a170 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
1a180 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
1a190 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
1a1a0 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
1a1b0 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
1a1c0 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
1a1d0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
1a1e0 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
1a1f0 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
1a200 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
1a210 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
1a220 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
1a230 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
1a240 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
1a250 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
1a260 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
1a270 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
1a280 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
1a290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a2a0 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
1a2b0 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
1a2c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
1a2d0 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
1a2e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1a2f0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
1a300 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
1a310 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1a320 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1a330 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a340 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
1a350 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
1a360 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
1a370 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
1a380 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
1a390 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
1a3a0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1a3b0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
1a3c0 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
1a3d0 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
1a3e0 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
1a3f0 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
1a400 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
1a410 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
1a420 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
1a430 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
1a440 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
1a450 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
1a460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a470 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
1a480 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1a490 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
1a4a0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
1a4b0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
1a4c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1a4d0 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
1a4e0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
1a4f0 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
1a500 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a510 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  v);.    int r2, 
1a520 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1a530 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1a540 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1a550 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1a560 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a  >eX==EX_List );.
1a570 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
1a580 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1a590 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
1a5a0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
1a5b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1a5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a5d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1a5e0 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73  tAnd, rLhs, rLhs
1a5f0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1a600 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
1a610 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
1a620 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1a630 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1a640 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1a650 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
1a660 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
1a670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
1a680 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
1a690 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
1a6a0 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
1a6b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1a6c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a6d0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
1a6e0 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
1a6f0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
1a700 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
1a710 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
1a720 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
1a730 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
1a740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a750 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c  Op4(v, OP_Eq, rL
1a760 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  hs, labelOk, r2,
1a770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a780 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1a790 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1a7a0 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
1a7b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1a7c0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
1a7d0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
1a7e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
1a7f0 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
1a800 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a810 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a820 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
1a830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a840 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
1a850 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
1a860 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1a870 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a880 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65   OP_Ne, rLhs, de
1a890 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1a8c0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1a8d0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
1a8e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1a8f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a900 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
1a910 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1a920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a930 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a940 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a950 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
1a960 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
1a970 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
1a980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a990 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
1a9a0 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
1a9b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a9c0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1a9d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
1a9e0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
1a9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1aa00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1aa10 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
1aa20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1aa30 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
1aa40 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f  kNull);.    goto
1aa50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aa60 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  IN_finished;.  }
1aa70 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43  ..  /* Step 2: C
1aa80 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1aa90 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20  he LHS contains 
1aaa0 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  any NULL columns
1aab0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c  .  If the.  ** L
1aac0 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  HS does contain 
1aad0 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72  NULLs then the r
1aae0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69  esult must be ei
1aaf0 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55  ther FALSE or NU
1ab00 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  LL..  ** We will
1ab10 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62   then skip the b
1ab20 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20  inary search of 
1ab30 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1ab40 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
1ab50 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1ab60 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1ab70 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65  estIfFalse;.  }e
1ab80 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65  lse{.    destSte
1ab90 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d  p2 = destStep6 =
1aba0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1abb0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20  Label(v);.  }.  
1abc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1abd0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1abe0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
1abf0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1ac00 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
1ac10 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
1ac20 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1ac30 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
1ac40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ac50 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68  , OP_IsNull, rLh
1ac60 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b  s+i, destStep2);
1ac70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ac80 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
1ac90 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20  }..  /* Step 3. 
1aca0 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20   The LHS is now 
1acb0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
1acc0 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69  NULL.  Do the bi
1acd0 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a  nary search.  **
1ace0 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e   of the RHS usin
1acf0 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70  g the LHS as a p
1ad00 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  robe.  If found,
1ad10 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20   the result is. 
1ad20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   ** true..  */. 
1ad30 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1ad40 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
1ad50 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
1ad60 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
1ad70 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
1ad80 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77   b-tree and so w
1ad90 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e  e also.    ** kn
1ada0 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ow that the RHS 
1adb0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65  is non-NULL.  He
1adc0 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20  nce, we combine 
1add0 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20  steps 3 and 4.  
1ade0 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67    ** into a sing
1adf0 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  le opcode. */.  
1ae00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ae10 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
1ae20 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
1ae30 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1ae40 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
1ae50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ae60 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1ae70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1ae80 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
1ae90 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
1aea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1aeb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1aec0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1aed0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
1aee0 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
1aef0 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
1af00 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
1af10 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
1af20 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
1af30 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
1af40 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
1af50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1af60 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1af70 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
1af80 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1af90 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
1afc0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1afd0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
1afe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1aff0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
1b000 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
1b010 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
1b020 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
1b030 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
1b040 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
1b050 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1b060 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1b070 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
1b080 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a  xpr->iTable, 0,.
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b0c0 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b0d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1b0e0 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
1b0f0 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
1b100 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
1b110 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
1b120 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
1b130 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
1b140 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1b150 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
1b160 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
1b170 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
1b180 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
1b190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b1a0 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1b1b0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
1b1c0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
1b1d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b1e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
1b1f0 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
1b200 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
1b210 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1b220 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
1b230 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
1b240 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
1b250 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1b260 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1b270 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
1b280 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
1b290 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
1b2a0 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
1b2b0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
1b2c0 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
1b2d0 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
1b2e0 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
1b2f0 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
1b300 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b310 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
1b320 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
1b330 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
1b340 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
1b350 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
1b360 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
1b370 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
1b380 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
1b390 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
1b3a0 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
1b3b0 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1b3c0 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
1b3d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b3e0 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
1b3f0 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
1b400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b410 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1b420 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
1b430 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56  estIfFalse);.  V
1b440 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b450 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1b460 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  ){.    destNotNu
1b470 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1b480 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b490 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1b4a0 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1b4b0 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1b4c0 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1b4d0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1b4e0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1b4f0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1b500 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1b510 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1b520 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1b530 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b540 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1b550 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1b560 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1b570 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1b580 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1b590 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1b5a0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1b5b0 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1b5c0 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1b5d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1b5e0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1b5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b600 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1b610 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
1b620 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  le, i, r3);.    
1b630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b640 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1b650 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
1b660 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
1b670 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1b680 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1b690 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
1b6a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b6b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b6c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1b6d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1b6e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b6f0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
1b700 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
1b710 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
1b720 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b730 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
1b740 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1b750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b760 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69  P_Next, pExpr->i
1b770 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31  Table, addrTop+1
1b780 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1b790 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
1b7a0 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
1b7b0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1b7c0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1b7d0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
1b7e0 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
1b7f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1b800 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b810 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
1b820 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
1b830 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
1b840 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
1b850 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
1b860 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b870 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
1b880 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1b890 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
1b8a0 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
1b8b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b8c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b8d0 4c 68 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Lhs);.  VdbeComm
1b8e0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
1b8f0 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33  expr"));.sqlite3
1b900 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
1b910 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
1b920 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1b930 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69  , aiMap);.  sqli
1b940 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1b950 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23  ->db, zAff);.}.#
1b960 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b970 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1b980 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b990 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b9a0 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
1b9b0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1b9c0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1b9d0 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
1b9e0 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
1b9f0 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
1ba00 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
1ba10 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
1ba20 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
1ba30 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
1ba40 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
1ba50 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
1ba60 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
1ba70 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1ba80 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
1ba90 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
1baa0 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
1bab0 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
1bac0 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1bad0 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
1bae0 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
1baf0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
1bb00 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
1bb10 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
1bb20 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
1bb30 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ble value;.    s
1bb40 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
1bb50 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
1bb60 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
1bb70 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
1bb80 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
1bb90 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
1bba0 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
1bbb0 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
1bbc0 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
1bbd0 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
1bbe0 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
1bbf0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
1bc00 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
1bc10 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1bc20 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20  lue, P4_REAL);. 
1bc30 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1bc40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1bc50 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1bc60 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
1bc70 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
1bc80 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
1bc90 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
1bca0 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
1bcb0 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
1bcc0 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
1bcd0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
1bce0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1bcf0 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
1bd00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1bd10 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
1bd20 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1bd30 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1bd40 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
1bd50 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1bd60 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
1bd70 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
1bd80 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
1bd90 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
1bda0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
1bdb0 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
1bdc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bdd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
1bde0 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
1bdf0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
1be00 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
1be10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
1be20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1be30 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
1be40 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
1be50 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
1be60 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
1be70 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e   if( (c==3 && !n
1be80 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32  egFlag) || (c==2
1be90 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26  ) || (negFlag &&
1bea0 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54   value==SMALLEST
1beb0 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66  _INT64)){.#ifdef
1bec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1bed0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1bee0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1bef0 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
1bf00 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
1bf10 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
1bf20 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
1bf30 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
1bf40 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47  E_OMIT_HEX_INTEG
1bf50 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ER.      if( sql
1bf60 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
1bf70 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "0x",2)==0 ){.  
1bf80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1bf90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68  orMsg(pParse, "h
1bfa0 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62  ex literal too b
1bfb0 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  ig: %s%s", negFl
1bfc0 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20  ag?"-":"",z);.  
1bfd0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1bfe0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1bff0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
1c000 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
1c010 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c030 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76  if( negFlag ){ v
1c040 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d  alue = c==3 ? SM
1c050 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d  ALLEST_INT64 : -
1c060 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73  value; }.      s
1c070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c080 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34  Dup8(v, OP_Int64
1c090 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
1c0a0 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e  8*)&value, P4_IN
1c0b0 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T64);.    }.  }.
1c0c0 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.../* Generate 
1c0d0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c  code that will l
1c0e0 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  oad into registe
1c0f0 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65  r regOut a value
1c100 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72   that is.** appr
1c110 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
1c120 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  iIdxCol-th colum
1c130 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
1c140 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c150 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
1c160 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  xColumn(.  Parse
1c170 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68   *pParse,  /* Th
1c180 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1c190 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
1c1a0 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx,    /* The in
1c1b0 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e  dex whose column
1c1c0 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64   is to be loaded
1c1d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1c1e0 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r,    /* Cursor 
1c1f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
1c200 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ble row */.  int
1c210 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20   iIdxCol,    /* 
1c220 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  The column of th
1c230 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f  e index to be lo
1c240 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  aded */.  int re
1c250 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f  gOut      /* Sto
1c260 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  re the index col
1c270 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69  umn value in thi
1c280 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1c290 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d  .  i16 iTabCol =
1c2a0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1c2b0 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20  iIdxCol];.  if( 
1c2c0 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52  iTabCol==XN_EXPR
1c2d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c2e0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
1c2f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1c300 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45  dx->aColExpr->nE
1c310 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20  xpr>iIdxCol );. 
1c320 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c330 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20  Tab = iTabCur + 
1c340 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  1;.    sqlite3Ex
1c350 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
1c360 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  e, pIdx->aColExp
1c370 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
1c380 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  xpr, regOut);.  
1c390 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
1c3a0 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ab = 0;.  }else{
1c3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c3c0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c3d0 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1c3e0 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1c3f0 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c420 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1c430 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1c440 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1c450 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1c460 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1c470 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1c480 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c490 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c4a0 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1c4b0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1c4c0 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1c4d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1c4e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1c4f0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1c500 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1c510 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1c520 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1c530 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1c540 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1c550 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1c560 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1c570 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c580 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1c590 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1c5a0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1c5b0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1c5c0 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1c5d0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1c5e0 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
1c5f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c600 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1c610 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
1c620 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  regOut);.    ret
1c630 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
1c640 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1c650 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1c660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c670 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1c680 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1c690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c6a0 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1c6b0 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1c6c0 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1c6d0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1c6e0 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1c6f0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1c700 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1c710 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1c720 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1c730 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1c740 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1c750 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1c760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c770 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1c780 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1c790 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1c7a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1c7b0 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1c7c0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1c7d0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1c7e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c7f0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1c800 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1c810 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1c820 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1c830 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1c840 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1c850 65 72 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20  er iReg. .**.** 
1c860 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1c870 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
1c880 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
1c890 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1c8a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
1c8b0 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
1c8c0 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
1c8d0 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
1c8e0 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
1c8f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1c900 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
1c910 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c920 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1c930 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1c940 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1c950 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
1c960 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c970 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
1c980 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
1c990 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
1c9a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c9b0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1c9c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c9d0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
1c9e0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1c9f0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1ca00 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
1ca10 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
1ca20 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70  s here */.  u8 p
1ca30 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5            /* 
1ca40 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
1ca50 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a  Column + FLAGS *
1ca60 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
1ca70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ca80 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1ca90 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1caa0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1cab0 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
1cac0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
1cad0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
1cae0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1caf0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
1cb00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1cb10 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
1cb20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1cb30 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1cb40 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1cb50 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1cb60 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1cb70 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f  To+nReg-1..*/.vo
1cb80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cb90 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
1cba0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1cbb0 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
1cbc0 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  eg){.  assert( i
1cbd0 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
1cbe0 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
1cbf0 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
1cc00 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
1cc10 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
1cc20 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
1cc30 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  g);.}../*.** Con
1cc40 76 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78  vert a scalar ex
1cc50 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
1cc60 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72   a TK_REGISTER r
1cc70 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65  eferencing.** re
1cc80 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1cc90 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
1cca0 73 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61  sure that iReg a
1ccb0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a  lready contains.
1ccc0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  ** the correct v
1ccd0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70  alue for the exp
1cce0 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ression..*/.stat
1ccf0 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
1cd00 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
1cd10 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
1cd20 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1cd30 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1cd40 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1cd50 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1cd60 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1cd70 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1cd80 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1cd90 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1cda0 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1cdb0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1cdc0 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1cdd0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1cde0 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1cdf0 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1ce00 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1ce10 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1ce20 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1ce30 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1ce40 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1ce50 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1ce60 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1ce70 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1ce80 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1ce90 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1cea0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1ceb0 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1cec0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1ced0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1cee0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1cef0 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1cf00 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1cf10 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1cf20 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1cf30 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1cf40 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1cf50 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1cf60 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1cf70 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1cf80 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1cf90 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1cfa0 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1cfb0 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1cfc0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1cfd0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1cfe0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1cff0 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1d000 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1d010 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1d020 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1d030 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ){.#if SQLITE_OM
1d040 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1d050 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23    iResult = 0;.#
1d060 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75  else.      iResu
1d070 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1d080 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1d090 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , p, 0, 0);.#end
1d0a0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1d0b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1d0c0 20 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73   iResult = pPars
1d0d0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
1d0e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1d0f0 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20   nResult;.      
1d100 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
1d110 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
1d120 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d130 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72  eFactorable(pPar
1d140 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  se, p->x.pList->
1d150 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52  a[i].pExpr, i+iR
1d160 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
1d170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d180 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a  rn iResult;.}...
1d190 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d1a0 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
1d1b0 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
1d1c0 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
1d1d0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
1d1e0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
1d1f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1d200 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
1d210 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
1d220 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
1d230 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1d240 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
1d250 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1d260 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
1d270 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
1d280 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
1d290 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
1d2a0 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
1d2b0 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
1d2c0 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
1d2d0 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
1d2e0 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
1d2f0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
1d300 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
1d310 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
1d320 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
1d330 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
1d340 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
1d350 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
1d360 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1d370 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
1d380 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1d390 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1d3a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d3b0 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
1d3c0 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
1d3d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1d3e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d3f0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1d400 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1d410 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
1d420 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
1d430 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
1d440 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
1d450 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1d460 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
1d470 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
1d480 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
1d490 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
1d4a0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1d4b0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
1d4c0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
1d4d0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
1d4e0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1d4f0 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20  r1, r2;         
1d500 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
1d510 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1d520 73 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  s */.  Expr temp
1d530 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1d540 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
1d550 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
1d560 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
1d570 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1d580 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1d590 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1d5a0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
1d5b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d5c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d5d0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1d5e0 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65  ;.  }..expr_code
1d5f0 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70  _doover:.  if( p
1d600 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1d610 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1d620 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1d630 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1d640 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1d650 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1d660 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
1d670 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1d680 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1d690 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
1d6a0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1d6b0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
1d6c0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
1d6d0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
1d6e0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1d6f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1d700 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
1d710 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
1d720 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  urn pCol->iMem;.
1d730 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d740 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
1d750 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
1d760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d770 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1d780 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
1d790 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1d7c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
1d7d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1d7e0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1d800 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
1d810 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
1d820 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
1d830 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d840 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1d850 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
1d860 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1d870 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1d880 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d890 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20  _FixedCol) ){.  
1d8a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 43 4f        /* This CO
1d8b0 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
1d8c0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6e 73  is really a cons
1d8d0 74 61 6e 74 20 64 75 65 20 74 6f 20 57 48 45 52  tant due to WHER
1d8e0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  E clause.       
1d8f0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   ** constraints,
1d900 20 61 6e 64 20 74 68 61 74 20 63 6f 6e 73 74 61   and that consta
1d910 6e 74 20 69 73 20 63 6f 64 65 64 20 62 79 20 74  nt is coded by t
1d920 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  he pExpr->pLeft.
1d930 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
1d940 73 73 73 69 6f 6e 2e 20 20 48 6f 77 65 76 65 72  sssion.  However
1d950 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d960 63 6f 6e 73 74 61 6e 74 20 68 61 73 20 74 68 65  constant has the
1d970 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 20   correct.       
1d980 20 2a 2a 20 64 61 74 61 74 79 70 65 20 62 79 20   ** datatype by 
1d990 61 70 70 6c 79 69 6e 67 20 74 68 65 20 41 66 66  applying the Aff
1d9a0 69 6e 69 74 79 20 6f 66 20 74 68 65 20 74 61 62  inity of the tab
1d9b0 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  le column to the
1d9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1d9d0 74 61 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tant..        */
1d9e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65  .        int iRe
1d9f0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1da00 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1da10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 74  , pExpr->pLeft,t
1da20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1da30 69 6e 74 20 61 66 66 20 3d 20 73 71 6c 69 74 65  int aff = sqlite
1da40 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
1da50 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62  nity(pExpr->pTab
1da60 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1da70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1da80 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff!=SQLITE_AFF_B
1da90 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LOB ){.         
1daa0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1dab0 61 72 20 7a 41 66 66 5b 5d 20 3d 20 22 42 5c 30  ar zAff[] = "B\0
1dac0 30 30 43 5c 30 30 30 44 5c 30 30 30 45 22 3b 0a  00C\000D\000E";.
1dad0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dae0 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ( SQLITE_AFF_BLO
1daf0 42 3d 3d 27 41 27 20 29 3b 0a 20 20 20 20 20 20  B=='A' );.      
1db00 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
1db10 54 45 5f 41 46 46 5f 54 45 58 54 3d 3d 27 42 27  TE_AFF_TEXT=='B'
1db20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1db30 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 20 29  ( iReg!=target )
1db40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1db50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1db60 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65  v, OP_SCopy, iRe
1db70 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1db80 20 20 20 20 20 20 20 20 69 52 65 67 20 3d 20 74          iReg = t
1db90 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 20  arget;.         
1dba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
1dbb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1dbc0 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 69  , OP_Affinity, i
1dbd0 52 65 67 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20  Reg, 1, 0,.     
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 26 7a 41 66 66 5b 28 61 66         &zAff[(af
1dc00 66 2d 27 42 27 29 2a 32 5d 2c 20 50 34 5f 53 54  f-'B')*2], P4_ST
1dc10 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
1dc20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dc30 69 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iReg;.      }.  
1dc40 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29      if( iTab<0 )
1dc50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1dc60 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30  arse->iSelfTab<0
1dc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1dc80 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1dc90 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1dca0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1dcb0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1dcd0 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  n pExpr->iColumn
1dce0 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   - pParse->iSelf
1dcf0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Tab;.        }el
1dd00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1dd10 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1dd20 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1dd30 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1dd40 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1dd50 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1dd60 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1dd70 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1dd80 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1dd90 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1dda0 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1ddb0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d  arse->iSelfTab -
1ddc0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1ddd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1dde0 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1ddf0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1de00 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1de10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1de40 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1de70 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a  pr->op2);.    }.
1de80 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1de90 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
1dea0 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1deb0 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
1dec0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1ded0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1dee0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45 46     case TK_TRUEF
1def0 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ALSE: {.      sq
1df00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1df10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73  v, OP_Integer, s
1df20 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
1df30 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61 72  alue(pExpr), tar
1df40 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1df50 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1df60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1df70 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1df80 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1df90 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
1dfa0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1dfb0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dfc0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1dfd0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1dfe0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1dff0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1e000 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e010 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1e020 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1e030 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
1e040 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e050 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e060 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e070 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
1e080 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
1e090 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t, pExpr->u.zTok
1e0a0 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  en);.      retur
1e0b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e0c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1e0d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e0e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e0f0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
1e100 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e110 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e130 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1e140 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1e150 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
1e160 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1e170 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
1e180 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
1e190 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1e1a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e1b0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1e1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e1d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1e1e0 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
1e1f0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
1e200 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e210 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e220 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
1e230 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
1e240 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
1e250 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
1e260 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
1e270 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
1e280 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1e290 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
1e2a0 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
1e2b0 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
1e2c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e2d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e2e0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
1e2f0 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
1e300 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
1e310 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1e320 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e330 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1e340 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e350 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e360 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e370 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e380 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e390 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
1e3a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e3b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
1e3c0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1e3d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e3e0 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
1e3f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
1e400 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1e410 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e420 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
1e430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1e440 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
1e450 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
1e460 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43  VList, pExpr->iC
1e470 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1e480 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e490 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
1e4a0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1e4b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30  >u.zToken, z)==0
1e4c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
1e4d0 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20  se->pVList[0] = 
1e4e0 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56  0; /* Indicate V
1e4f0 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67  List may no long
1e500 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  er be enlarged *
1e510 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1e520 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
1e530 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54   (char*)z, P4_ST
1e540 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
1e550 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e560 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e570 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
1e580 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e590 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1e5a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1e5b0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
1e5c0 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
1e5d0 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
1e5e0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1e5f0 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
1e600 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
1e610 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1e620 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e630 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e640 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1e650 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1e660 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1e670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e680 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1e690 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1e6a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1e6b0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1e6c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1e6d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e6e0 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
1e710 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
1e720 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
1e730 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52        return inR
1e740 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  eg;.    }.#endif
1e750 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e760 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1e770 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1e780 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
1e790 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1e7a0 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1e7b0 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51  E;.      p5 = SQ
1e7c0 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
1e7d0 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1e7e0 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
1e7f0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1e800 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1e810 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1e820 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1e830 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1e840 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78  K_EQ: {.      Ex
1e850 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1e860 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1e870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e880 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29  sVector(pLeft) )
1e890 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65  {.        codeVe
1e8a0 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ctorCompare(pPar
1e8b0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1e8c0 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20  t, op, p5);.    
1e8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e8f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e900 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  , pLeft, &regFre
1e910 65 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  e1);.        ass
1e920 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
1e930 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20  EX_Right );.    
1e940 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e950 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e960 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52  rse, pExpr->x.pR
1e970 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e980 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f  ;.        codeCo
1e990 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
1e9a0 65 66 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52  eft, pExpr->x.pR
1e9b0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1e9c0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1e9d0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1e9e0 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1e9f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1ea00 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1ea10 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1ea20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ea30 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1ea40 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1ea50 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1ea60 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1ea70 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ea80 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1ea90 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1eaa0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1eab0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1eac0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ead0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1eae0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1eaf0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1eb00 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1eb10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1eb20 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1eb30 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1eb40 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1eb50 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1eb60 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1eb70 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1eb80 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1eb90 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1eba0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1ebb0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ebc0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1ebd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ebe0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ebf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ec00 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1ec10 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1ec20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ec30 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1ec40 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1ec50 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1ec60 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1ec70 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1ec80 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1ec90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1eca0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1ecb0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1ecc0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1ecd0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1ece0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1ecf0 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1ed00 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1ed10 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1ed20 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1ed30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ed40 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1ed50 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1ed60 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1ed70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ed80 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1ed90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1eda0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1edb0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1edc0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1edd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ede0 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1edf0 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1ee00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1ee10 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1ee20 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1ee30 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1ee40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ee50 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1ee60 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1ee70 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1ee80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee90 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1eea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1eeb0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1eec0 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1eed0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1eee0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1eef0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1ef00 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1ef10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ef20 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1ef30 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1ef40 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1ef50 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1ef60 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1ef70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ef80 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1ef90 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1efa0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1efb0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1efc0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1efd0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1efe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1eff0 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1f000 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f010 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f020 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f030 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f040 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1f050 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20  r->eX==EX_Right 
1f060 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1f070 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f080 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f090 3e 78 2e 70 52 69 67 68 74 2c 20 26 72 65 67 46  >x.pRight, &regF
1f0a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1f0b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f0c0 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1f0d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1f0e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f0f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f100 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f110 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f130 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1f140 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1f150 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1f160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1f170 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1f180 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1f190 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1f1a0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1f1b0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1f1c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f1d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f1e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f1f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1f200 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1f210 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f220 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1f230 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f240 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f250 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1f260 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1f270 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1f280 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1f290 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f2a0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1f2b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f2c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65        memset(&te
1f2d0 6d 70 58 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74  mpX, 0, sizeof(t
1f2e0 65 6d 70 58 29 29 3b 0a 20 20 20 20 20 20 20 20  empX));.        
1f2f0 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
1f300 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
1f310 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
1f320 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
1f330 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
1f340 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
1f350 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
1f360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f370 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
1f380 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
1f390 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1f3a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f3b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f3c0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
1f3d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f3e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f3f0 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
1f400 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
1f410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f420 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1f430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f440 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f450 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
1f460 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1f470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f480 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
1f490 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
1f4a0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
1f4b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f4c0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
1f4d0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
1f4e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1f4f0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f510 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f520 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f530 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1f540 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f550 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1f570 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
1f580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f590 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
1f5a0 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
1f5b0 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49   isTrue;    /* I
1f5c0 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
1f5d0 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69   TRUE */.      i
1f5e0 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a  nt bNormal;   /*
1f5f0 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46   IS TRUE or IS F
1f600 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31  ALSE */.      r1
1f610 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f620 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f630 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f640 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1f650 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f660 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  1==0 );.      as
1f670 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
1f680 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20  =EX_Right );.   
1f690 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
1f6a0 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
1f6b0 65 28 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  e(pExpr->x.pRigh
1f6c0 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61  t);.      bNorma
1f6d0 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  l = pExpr->op2==
1f6e0 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65 73  TK_IS;.      tes
1f6f0 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
1f700 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20   bNormal);.     
1f710 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
1f720 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1f730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f740 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1f750 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e 52  _IsTrue, r1, inR
1f760 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73 54  eg, !isTrue, isT
1f770 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a  rue ^ bNormal);.
1f780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f790 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1f7a0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1f7b0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1f7c0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1f7d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1f7e0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1f7f0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1f800 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1f810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f820 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1f830 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1f840 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1f850 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1f860 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f870 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1f880 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
1f890 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f8a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f8b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f8c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1f8d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f8e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
1f8f0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f900 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
1f910 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f920 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f930 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1f940 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f950 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1f960 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1f970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f980 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
1f990 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1f9a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1f9b0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
1f9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f9d0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1f9e0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1f9f0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
1fa00 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1fa10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1fa20 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
1fa30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fa40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fa50 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1fa60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fa70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fa80 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
1fa90 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
1faa0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1fab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fac0 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f      return pInfo
1fad0 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
1fae0 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
1faf0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1fb00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fb10 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
1fb20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
1fb30 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
1fb40 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
1fb50 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1fb60 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
1fb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fb80 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
1fb90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1fba0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
1fbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fbc0 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
1fbd0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
1fbe0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1fbf0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
1fc00 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
1fc10 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
1fc20 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
1fc30 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
1fc40 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
1fc50 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
1fc60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1fc90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1fca0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1fcb0 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
1fcc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1fcd0 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1fce0 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1fcf0 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1fd00 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1fd10 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1fd20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1fd30 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1fd40 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1fd50 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
1fd60 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
1fd70 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 21  FUNC.      if( !
1fd80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fd90 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1fda0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1fdb0 26 26 20 70 45 78 70 72 2d 3e 70 57 69 6e 20 29  && pExpr->pWin )
1fdc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fdd0 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e 72 65   pExpr->pWin->re
1fde0 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d  gResult;.      }
1fdf0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1fe00 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
1fe10 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69  (pParse) && sqli
1fe20 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1fe30 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
1fe40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ){.        /* SQ
1fe50 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  L functions can 
1fe60 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f  be expensive. So
1fe70 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e   try to move con
1fe80 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a  stant functions.
1fe90 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f          ** out o
1fea0 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
1feb0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
1fec0 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50  eans an extra OP
1fed0 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20  _Copy. */.      
1fee0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1fef0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1ff00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
1ff10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ff20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ff30 65 58 3d 3d 45 58 5f 4c 69 73 74 20 7c 7c 20 70  eX==EX_List || p
1ff40 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e  Expr->eX==EX_Non
1ff50 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  e );.      if( E
1ff60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ff70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1ff80 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1ff90 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1ffa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1ffb0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1ffc0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1ffd0 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
1ffe0 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
1fff0 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
20000 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20010 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20020 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
20030 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
20040 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
20050 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20060 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
20070 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
20080 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
20090 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
200a0 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
200b0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
200c0 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
200d0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
200e0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
200f0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
20100 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
20110 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
20120 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
20130 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
20140 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
20150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20160 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20170 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
20180 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
20190 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
201a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
201b0 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
201c0 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
201d0 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
201e0 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
201f0 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
20200 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
20210 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
20220 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
20230 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
20240 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
20250 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
20260 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
20270 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20280 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20290 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
202a0 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
202b0 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
202c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
202d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
202e0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
202f0 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
20300 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20310 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20320 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
20330 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
20340 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
20350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
20360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20370 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
20380 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
20390 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
203a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
203b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
203c0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
203d0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
203e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
203f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
20400 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20410 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
20420 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
20430 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
20440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
20450 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
20460 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
20470 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
20480 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
20490 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
204a0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
204b0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
204c0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
204d0 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
204e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
204f0 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
20500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
20510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
20520 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  get(pParse, pFar
20530 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
20540 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
20550 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20560 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68  EBUG.      /* Th
20570 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e  e AFFINITY() fun
20580 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ction evaluates 
20590 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
205a0 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20   describes.     
205b0 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66   ** the type aff
205c0 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67  inity of the arg
205d0 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ument.  This is 
205e0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
205f0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
20600 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67   SQLite type log
20610 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
20620 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
20630 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20640 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b  FUNC_AFFINITY ){
20650 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
20660 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b  har *azAff[] = {
20670 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c   "blob", "text",
20680 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74   "numeric", "int
20690 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b  eger", "real" };
206a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
206b0 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
206c0 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
206d0 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
206e0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
206f0 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78  (pFarg->a[0].pEx
20700 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
20710 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
20720 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20  ng(v, target, . 
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66               aff
20750 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c   ? azAff[aff-SQL
20760 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20  ITE_AFF_BLOB] : 
20770 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20  "none");.       
20780 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
20790 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
207a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
207b0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
207c0 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
207d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
207e0 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
207f0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
20800 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20810 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
20820 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
20830 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
20840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20850 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
20860 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20870 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
20880 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
20890 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
208a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
208b0 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
208c0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
208d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
208e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
208f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
20900 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
20910 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
20920 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
20930 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
20940 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
20950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20960 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
20970 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20980 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
20990 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
209a0 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
209b0 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
209c0 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
209d0 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
209e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
209f0 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
20a00 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
20a10 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
20a20 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
20a30 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
20a40 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
20a50 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
20a60 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
20a70 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
20a80 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
20a90 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
20aa0 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
20ab0 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
20ac0 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
20ad0 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
20ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
20af0 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
20b00 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
20b10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
20b20 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
20b30 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
20b40 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
20b50 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
20b60 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
20b70 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
20b80 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
20b90 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
20ba0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
20bb0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
20bc0 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
20bd0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
20be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
20bf0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
20c00 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
20c10 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
20c20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20c30 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
20c40 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
20c50 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
20c60 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
20c70 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20ca0 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
20cb0 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
20cc0 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
20cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
20ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20cf0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
20d00 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
20d10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
20d40 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
20d50 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
20d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20d70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
20d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20d90 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
20da0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
20db0 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
20dc0 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
20dd0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
20de0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
20df0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
20e00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20e10 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
20e20 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
20e30 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
20e40 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
20e50 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
20e60 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
20e70 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
20e80 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
20e90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
20ea0 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
20eb0 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
20ec0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
20ed0 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
20ee0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
20ef0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
20f00 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
20f10 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
20f20 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
20f30 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
20f40 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
20f50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
20f60 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
20f70 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
20f80 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
20f90 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
20fa0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
20fb0 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
20fc0 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
20fd0 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
20fe0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
20ff0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
21000 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
21010 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
21020 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
21030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21040 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
21050 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21060 70 45 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46  pExpr, EP_InfixF
21070 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
21080 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
21090 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
210a0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
210b0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
210c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
210d0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
210e0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
210f0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
21100 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
21110 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
21120 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21130 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
21140 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
21150 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
21160 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
21170 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
21180 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
21190 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
211a0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
211b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
211c0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
211d0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
211e0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
211f0 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
21200 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
21210 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
21220 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21230 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21240 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a  _FUNC_OFFSET ){.
21250 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41          Expr *pA
21260 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rg = pFarg->a[0]
21270 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
21280 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b  if( pArg->op==TK
21290 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
212a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
212b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
212c0 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c  set, pArg->iTabl
212d0 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e  e, pArg->iColumn
212e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
212f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21320 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21340 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
21350 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
21360 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21370 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
21380 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20   ? OP_PureFunc0 
21390 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a  : OP_Function0,.
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
213c0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
213d0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
213e0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
213f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21400 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
21410 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
21420 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
21430 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
21440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21450 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
21460 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
21470 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21480 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21490 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
214a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
214b0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
214c0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
214d0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
214e0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
214f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
21500 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
21510 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21520 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21530 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
21540 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
21550 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
21560 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
21570 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
21580 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
21590 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
215a0 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
215b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
215c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
215d0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
215e0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
215f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21600 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21610 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
21620 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
21630 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28  int n;.      if(
21640 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21650 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
21660 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
21670 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
21680 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
21690 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
216a0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
216b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
216c0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
216d0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
216e0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
216f0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
21700 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
21710 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
21720 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
21730 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
21740 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
21750 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
21760 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21770 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
21780 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
21790 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
217c0 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
217d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
217e0 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
217f0 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
21800 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
21810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
21820 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
21830 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
21840 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21850 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
21860 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
21870 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21880 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
21890 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
218a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
218b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
218c0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
218d0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
218e0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
218f0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
21900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21910 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
21920 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
21930 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21940 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
21950 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
21960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21970 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
21980 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
21990 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
219a0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
219b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
219c0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
219d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
219e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
219f0 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
21a00 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
21a10 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
21a20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
21a30 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
21a40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
21a50 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
21a60 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
21a70 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21a80 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
21a90 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21aa0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
21ab0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
21ac0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
21ad0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
21ae0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
21af0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
21b00 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
21b10 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
21b20 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
21b30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
21b40 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21b50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21b60 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
21b70 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
21b80 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
21b90 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
21ba0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
21bb0 20 20 20 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64     goto expr_cod
21bc0 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31  e_doover; /* 201
21bd0 38 2d 30 34 2d 32 38 3a 20 50 72 65 76 65 6e 74  8-04-28: Prevent
21be0 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 2e   deep recursion.
21bf0 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20   OSSFuzz. */.   
21c00 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
21c10 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
21c20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
21c30 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
21c40 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
21c50 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
21c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
21c70 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
21c80 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
21c90 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
21ca0 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
21cb0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
21cc0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
21cd0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
21ce0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
21cf0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
21d00 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
21d10 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
21d20 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
21d30 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
21d40 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
21d50 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
21d60 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
21d70 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
21d80 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
21d90 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
21da0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
21db0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
21dc0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
21dd0 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
21de0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
21df0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
21e00 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
21e10 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
21e20 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
21e30 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
21e40 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
21e50 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
21e60 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
21e70 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
21e80 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
21e90 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
21ea0 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
21eb0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
21ec0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
21ed0 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
21ee0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
21ef0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
21f00 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
21f10 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
21f20 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
21f30 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
21f40 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
21f50 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
21f60 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
21f70 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
21f80 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
21f90 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
21fa0 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
21fb0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
21fc0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
21fd0 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
21fe0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
21ff0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
22000 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
22010 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
22020 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
22030 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22040 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
22050 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
22060 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
22070 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
22080 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
22090 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
220a0 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
220b0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
220c0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
220d0 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
220e0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
220f0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
22100 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
22110 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
22120 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
22130 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
22140 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
22150 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
22160 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
22170 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
22180 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
22190 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
221a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
221b0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
221c0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
221d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
221e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
221f0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
22200 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
22210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22220 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
22230 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
22240 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
22250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
22260 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
22270 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
22280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22290 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
222a0 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
222b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
222c0 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e  t((v, "r[%d]=%s.
222d0 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  %s", target,.   
222e0 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
222f0 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
22300 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
22310 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
22320 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
22330 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
22340 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
22350 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a  ame).      ));..
22360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22370 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
22380 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
22390 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
223a0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
223b0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
223c0 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
223d0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
223e0 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
223f0 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
22400 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
22410 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
22420 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
22430 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
22440 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
22450 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
22460 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
22470 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
22480 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
22490 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
224a0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
224b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
224c0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
224d0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
224e0 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
224f0 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
22500 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
22510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22520 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
22530 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
22540 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
22550 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
22560 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
22570 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
22580 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22590 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
225a0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
225b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
225c0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
225d0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20  IF_NULL_ROW: {. 
225e0 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52       int addrINR
225f0 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20  ;.      addrINR 
22600 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
22610 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c  Op1(v, OP_IfNull
22620 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Row, pExpr->iTab
22630 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  le);.      inReg
22640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22650 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
22660 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
22670 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22680 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
22690 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20  e(v, addrINR);. 
226a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
226b0 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
226c0 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  INR, inReg);.   
226d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
226e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
226f0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
22700 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
22710 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
22720 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
22730 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22740 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22750 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
22760 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
22770 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22780 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
22790 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
227a0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
227b0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
227c0 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
227d0 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
227e0 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
227f0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
22800 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
22810 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22820 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
22830 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
22840 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
22850 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22860 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
22870 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
22880 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
22890 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
228a0 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
228b0 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
228c0 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
228d0 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
228e0 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
228f0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
22900 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
22910 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
22920 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
22930 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
22940 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
22950 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
22960 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
22970 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
22980 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22990 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
229a0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
229b0 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
229c0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
229d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
229e0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
229f0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
22a00 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
22a10 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
22a20 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
22a30 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
22a40 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
22a50 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
22a60 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
22a70 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
22a80 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
22a90 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
22aa0 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
22ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
22ac0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
22ad0 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
22ae0 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
22af0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
22b00 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
22b10 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
22b20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
22b30 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
22b60 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
22b70 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
22b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ba0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22bb0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
22bc0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
22bd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
22be0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
22bf0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
22c00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
22c10 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
22c20 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
22c30 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
22c40 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
22c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22c60 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
22c70 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
22c80 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ca0 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
22cb0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
22cc0 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ce0 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
22cf0 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
22d00 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
22d10 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
22d20 45 58 5f 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  EX_List );.     
22d30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
22d40 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
22d50 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
22d60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
22d70 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
22d80 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
22d90 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
22da0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
22db0 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
22dc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22dd0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
22de0 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
22df0 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
22e00 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
22e10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22e20 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
22e30 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
22e40 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
22e50 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
22e60 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
22e70 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
22e80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
22e90 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
22ea0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
22eb0 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
22ec0 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
22ed0 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
22ee0 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
22ef0 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
22f00 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
22f10 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
22f20 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
22f30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
22f40 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
22f50 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
22f60 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
22f70 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
22f80 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
22f90 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
22fa0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
22fb0 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
22fc0 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
22fd0 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
22fe0 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
22ff0 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
23000 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
23010 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
23020 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
23030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
23040 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
23050 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
23060 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
23070 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  +2){.        if(
23080 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
23090 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
230a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
230b0 70 43 6f 6d 70 61 72 65 2e 78 2e 70 52 69 67 68  pCompare.x.pRigh
230c0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
230d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
230e0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 65 58 20 3d    opCompare.eX =
230f0 20 45 58 5f 52 69 67 68 74 3b 0a 20 20 20 20 20   EX_Right;.     
23100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23110 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
23120 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
23130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23140 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
23150 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23160 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
23170 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
23180 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
231a0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
231b0 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
231c0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
231d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
231e0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
231f0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
23200 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23220 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
23230 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23240 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23260 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
23270 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
23280 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23290 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
232a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
232b0 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
232c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
232d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
232e0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
232f0 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
23300 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
23310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23330 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
23340 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
23350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23360 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23370 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
23380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
23390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
233a0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
233b0 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
233c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
233d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
233e0 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
233f0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23400 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23410 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
23420 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
23430 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
23440 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23450 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23460 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
23470 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
23480 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
23490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
234a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
234d0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
234e0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
234f0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
23500 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23510 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23520 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23530 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
23540 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
23550 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
23560 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23570 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23580 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
23590 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
235a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
235b0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
235c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
235d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
235e0 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
235f0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
23600 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
23610 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23620 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
23630 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
23640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23650 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
23660 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
23670 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
23680 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
236b0 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
236c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
236d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
236e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
236f0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
23700 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23710 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
23720 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
23730 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23740 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
23750 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
23760 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
23770 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
23780 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
23790 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
237a0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
237b0 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
237c0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
237d0 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
237e0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
237f0 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
23800 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
23810 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
23820 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
23830 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
23840 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
23850 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
23860 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
23870 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
23880 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
23890 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
238a0 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
238b0 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
238c0 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
238d0 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
238e0 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
238f0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
23900 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
23910 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
23920 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
23930 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
23940 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
23950 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
23960 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
23970 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
23980 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
23990 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
239a0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
239b0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
239c0 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
239d0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
239e0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
239f0 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
23a00 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
23a10 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
23a20 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
23a30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23a40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
23a50 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
23a60 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
23a70 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
23a80 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
23a90 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
23aa0 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
23ab0 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
23ac0 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
23ad0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23ae0 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
23af0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
23b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23b10 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
23b20 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
23b30 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
23b40 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
23b50 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23b60 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
23b70 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
23b80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23b90 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
23ba0 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
23bb0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
23bc0 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
23bd0 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
23be0 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
23bf0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23c00 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
23c10 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
23c20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
23c30 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
23c40 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
23c50 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
23c60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23c70 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
23c80 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
23c90 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
23ca0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
23cb0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
23cc0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
23cd0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
23ce0 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
23cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
23d00 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
23d10 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
23d20 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
23d30 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
23d40 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
23d50 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
23d60 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
23d70 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
23d80 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
23d90 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
23da0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
23db0 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
23dc0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23dd0 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
23de0 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
23df0 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
23e00 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
23e10 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
23e20 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
23e30 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
23e40 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
23e50 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
23e60 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
23e70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23e80 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
23e90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23ea0 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
23eb0 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
23ec0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
23ed0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
23ee0 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
23ef0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
23f00 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
23f10 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
23f20 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
23f30 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
23f40 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
23f50 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
23f60 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
23f70 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
23f80 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
23f90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
23fa0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
23fb0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
23fc0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23fd0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23fe0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
23ff0 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
24000 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
24010 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
24020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24030 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24040 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
24050 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
24060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
24070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24080 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24090 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
240a0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
240b0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
240c0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
240d0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
240e0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
240f0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24100 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24110 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
24120 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
24130 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24140 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24150 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
24160 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
24170 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
24180 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
24190 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
241a0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
241b0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
241c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
241d0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
241e0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
241f0 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
24200 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24210 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24220 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24230 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24240 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
24250 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
24260 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
24270 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24280 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
24290 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
242a0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
242b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
242c0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
242d0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
242e0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
242f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24300 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
24310 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
24320 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
24330 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
24340 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
24350 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24360 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
24370 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
24380 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
24390 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
243a0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
243b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
243c0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
243d0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
243e0 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
243f0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24400 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24410 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24420 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
24430 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
24440 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
24450 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
24460 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
24470 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24480 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24490 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
244a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
244b0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
244c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
244d0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
244e0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
244f0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24500 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24510 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24520 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24530 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24540 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24550 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
24560 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24570 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24580 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
24590 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
245a0 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
245b0 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
245c0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
245d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
245e0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
245f0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24600 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24610 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
24620 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
24630 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
24640 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24650 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
24660 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24670 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
24680 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24690 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
246a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
246b0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
246c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
246d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
246e0 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65  at evaluates the
246f0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
24700 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
24710 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
24720 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
24730 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
24740 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
24750 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
24760 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
24770 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
24780 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
24790 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
247a0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
247b0 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
247c0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
247d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
247e0 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
247f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24800 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
24810 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
24820 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
24830 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
24840 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
24850 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
24860 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
24870 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
24880 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
24890 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
248a0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
248b0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
248c0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
248d0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
248e0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
248f0 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iMem;..  assert(
24900 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
24910 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
24920 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  !=TK_REGISTER );
24930 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
24940 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
24950 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65  , target);.  iMe
24960 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
24970 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
24980 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
24990 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d  py, target, iMem
249a0 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  );.  exprToRegis
249b0 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29  ter(pExpr, iMem)
249c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
249d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
249e0 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
249f0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
24a00 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
24a10 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
24a20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
24a30 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
24a40 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
24a50 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
24a60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
24a70 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
24a80 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
24a90 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73  urned will.** us
24aa0 75 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e  ually be pList->
24ab0 6e 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20  nExpr but might 
24ac0 62 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51  be reduced if SQ
24ad0 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
24ae0 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e  F.** is defined.
24af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
24b00 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20  E_ECEL_DUP flag 
24b10 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67  prevents the arg
24b20 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  uments from bein
24b30 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e  g.** filled usin
24b40 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f  g OP_SCopy.  OP_
24b50 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65  Copy must be use
24b60 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
24b70 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24b80 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74  _FACTOR argument
24b90 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74   allows constant
24ba0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65   arguments to be
24bb0 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74  .** factored out
24bc0 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61   into initializa
24bd0 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  tion code..**.**
24be0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
24bf0 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20  _REF flag means 
24c00 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
24c10 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74   in the list wit
24c20 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b  h.** ExprList.a[
24c30 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
24c40 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79  l>0 have already
24c50 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20   been evaluated 
24c60 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  and stored.** in
24c70 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72   registers at sr
24c80 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65  cReg, and so the
24c90 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f   value can be co
24ca0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e  pied from there.
24cb0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43  .** If SQLITE_EC
24cc0 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c  EL_OMITREF is al
24cd0 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  so set, then the
24ce0 20 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78   values with u.x
24cf0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a  .iOrderByCol>0.*
24d00 2a 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69  * are simply omi
24d10 74 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  tted rather than
24d20 20 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72   being copied fr
24d30 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e  om srcReg..*/.in
24d40 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
24d50 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
24d60 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
24d70 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24d80 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
24d90 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
24da0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
24db0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
24dc0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
24dd0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
24de0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
24df0 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c  */.  int srcReg,
24e00 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
24e10 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53  e registers if S
24e20 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a  QLITE_ECEL_REF *
24e30 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20  /.  u8 flags    
24e40 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
24e50 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f  _ECEL_* flags */
24e60 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
24e70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24e80 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  m;.  int i, j, n
24e90 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
24ea0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24eb0 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
24ec0 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
24ed0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
24ee0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
24ef0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
24f00 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24f10 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
24f20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
24f30 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
24f40 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
24f50 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
24f60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
24f70 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
24f80 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
24f90 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
24fa0 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
24fb0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
24fc0 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
24fd0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
24fe0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
24ff0 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66  m->pExpr;.#ifdef
25000 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
25010 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
25020 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
25030 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  bSorterRef ){.  
25040 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e      i--;.      n
25050 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  --;.    }else.#e
25060 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c  ndif.    if( (fl
25070 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
25080 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
25090 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
250a0 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
250b0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
250c0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
250d0 54 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20  TREF ){.        
250e0 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  i--;.        n--
250f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25110 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
25120 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
25130 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
25140 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
25150 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25160 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30  _ECEL_FACTOR)!=0
25170 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
25180 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
25190 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
251a0 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  r).    ){.      
251b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
251c0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
251d0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
251e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
251f0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
25200 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25210 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
25220 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
25230 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
25240 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
25250 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
25260 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
25270 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
25280 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
25290 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
252a0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
252b0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
252c0 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
252d0 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
252e0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
252f0 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
25300 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
25310 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
25320 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
25330 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25350 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
25360 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
25370 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25380 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25390 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
253a0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
253b0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
253c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
253d0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
253e0 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
253f0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
25400 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
25410 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
25420 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
25430 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
25440 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
25450 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
25460 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
25470 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
25480 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
25490 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
254a0 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
254c0 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
254d0 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
254e0 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
254f0 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
25500 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
25510 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
25520 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
25530 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25540 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
25550 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
25560 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
25570 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
25580 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
25590 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
255a0 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
255b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
255c0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
255d0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
255e0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
255f0 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
25600 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
25610 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
25620 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
25630 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
25640 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
25650 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
25660 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
25670 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
25680 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
25690 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
256a0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
256b0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
256c0 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
256d0 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
256e0 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
256f0 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
25700 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
25710 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
25720 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
25730 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
25740 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
25750 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
25760 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
25770 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
25780 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
25790 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
257a0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
257b0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
257c0 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
257d0 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
257e0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
257f0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
25800 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
25810 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
25820 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
25830 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
25840 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
25850 3d 45 58 5f 4c 69 73 74 20 29 3b 0a 20 20 65 78  =EX_List );.  ex
25860 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
25870 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f  eft;.  exprAnd.o
25880 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78  p = TK_AND;.  ex
25890 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
258a0 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ompLeft;.  exprA
258b0 6e 64 2e 78 2e 70 52 69 67 68 74 20 3d 20 26 63  nd.x.pRight = &c
258c0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 65 78 70 72  ompRight;.  expr
258d0 41 6e 64 2e 65 58 20 3d 20 45 58 5f 52 69 67 68  And.eX = EX_Righ
258e0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
258f0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
25900 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
25910 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
25920 78 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  x.pRight = pExpr
25930 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
25940 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 4c 65 66  pExpr;.  compLef
25950 74 2e 65 58 20 3d 20 45 58 5f 52 69 67 68 74 3b  t.eX = EX_Right;
25960 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
25970 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
25980 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
25990 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
259a0 2e 78 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  .x.pRight = pExp
259b0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
259c0 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
259d0 67 68 74 2e 65 58 20 3d 20 45 58 5f 52 69 67 68  ght.eX = EX_Righ
259e0 74 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  t;.  exprToRegis
259f0 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72  ter(&exprX, expr
25a00 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
25a10 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
25a20 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a  ree1));.  if( xJ
25a30 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70  ump ){.    xJump
25a40 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
25a50 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
25a60 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
25a70 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65     /* Mark the e
25a80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69  xpression is bei
25a90 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  ng from the ON o
25aa0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
25ab0 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20  f a join.    ** 
25ac0 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
25ad0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25ae0 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
25af0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
25b00 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  move.    ** it i
25b10 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43  nto the Parse.pC
25b20 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20  onstExpr list.  
25b30 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20  We should use a 
25b40 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73  new bit for this
25b50 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61  ,.    ** for cla
25b60 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
25b70 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
25b80 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
25b90 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a  ield so we.    *
25ba0 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20  * have to reuse 
25bb0 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
25bc0 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f  bit.  Bummer. */
25bd0 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73  .    exprX.flags
25be0 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
25bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
25c00 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
25c10 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
25c20 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
25c30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
25c40 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
25c50 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
25c60 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
25c70 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
25c80 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25c90 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
25ca0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
25cb0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
25cc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25cd0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25ce0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
25cf0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
25d00 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
25d10 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
25d20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25d30 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
25d40 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
25d50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25d60 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25d70 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25d80 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
25d90 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
25da0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25db0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
25dc0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
25dd0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
25de0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
25df0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25e00 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
25e10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
25e20 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
25e30 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
25e40 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
25e50 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25e60 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
25e70 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
25e80 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25e90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
25ea0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
25eb0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
25ec0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25ed0 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ump==0 );.}../*.
25ee0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25ef0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
25f00 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
25f10 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
25f20 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
25f30 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
25f40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
25f50 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
25f60 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
25f70 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
25f80 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
25f90 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
25fa0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25fb0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
25fc0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
25fd0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
25fe0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
25ff0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
26000 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
26010 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
26020 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
26030 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
26040 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
26050 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
26060 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
26070 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
26080 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
26090 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
260a0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
260b0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
260c0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
260d0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
260e0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
260f0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
26100 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
26110 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
26120 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
26130 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
26140 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
26150 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
26160 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
26170 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
26180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26190 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
261a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
261b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
261c0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
261d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
261e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
261f0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
26200 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26210 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26220 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26240 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26250 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26260 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26270 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26280 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
26290 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
262a0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
262b0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
262c0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
262d0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
262e0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
262f0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
26300 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
26310 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
26320 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
26330 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
26340 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
26350 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
26360 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26370 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
26380 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26390 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
263a0 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
263b0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
263c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 61 73 73  NULL);.      ass
263d0 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
263e0 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20  EX_Right );.    
263f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
26400 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
26410 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 64 65 73  r->x.pRight, des
26420 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26440 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26450 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
26460 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26470 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
26480 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
26490 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
264a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
264b0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
264c0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
264d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
264e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
264f0 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29  ->eX==EX_Right )
26500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26510 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26520 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
26530 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
26540 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26550 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26560 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
26570 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26580 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
265a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
265b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
265c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
265d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
265f0 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
26600 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20   isNot;      /* 
26610 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
26620 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
26630 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
26640 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
26650 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
26660 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
26670 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26680 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d  );.      isNot =
26690 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
266a0 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 61 73 73  ISNOT;.      ass
266b0 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
266c0 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20  EX_Right );.    
266d0 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
266e0 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
266f0 28 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74  (pExpr->x.pRight
26700 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26710 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
26720 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
26730 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
26740 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
26750 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
26760 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
26770 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26780 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26790 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
267c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
267d0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
267e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
267f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26800 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26810 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26830 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
26840 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
26850 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
26860 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26870 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
26880 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
26890 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
268a0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
268b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
268c0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
268d0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
268e0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
268f0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
26900 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
26910 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
26920 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
26930 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
26940 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
26950 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
26960 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
26970 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
26980 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
26990 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
269a0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
269b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
269c0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
269d0 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
269e0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
269f0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
26a00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26a10 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26a20 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
26a30 65 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e1);.      asser
26a40 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
26a50 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  _Right );.      
26a60 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
26a70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26a80 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74   pExpr->x.pRight
26a90 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
26aa0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
26ab0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
26ac0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  Left, pExpr->x.p
26ad0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
26af0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
26b00 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
26b10 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
26b20 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
26b30 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
26b40 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26b50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
26b60 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
26b70 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26b80 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
26b90 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
26ba0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
26bb0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
26bc0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26bd0 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
26be0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
26bf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26c00 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
26c10 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
26c20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26c30 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
26c40 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26c50 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
26c60 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
26c70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26c80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
26c90 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
26ca0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
26cb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
26cc0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
26cd0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
26ce0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
26cf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26d00 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
26d10 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
26d20 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
26d30 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26d40 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
26d50 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26d60 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26d70 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26d80 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26d90 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26da0 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
26db0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26dc0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
26dd0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
26de0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26df0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26e00 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
26e10 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
26e20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26e30 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
26e40 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
26e50 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
26e60 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
26e70 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
26e80 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
26e90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
26ea0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
26eb0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26ec0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26ed0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26ee0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f00 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
26f10 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
26f20 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26f30 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
26f40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26f50 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
26f60 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
26f70 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
26f80 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26f90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26fa0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
26fb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26fc0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26fd0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
26fe0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
26ff0 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
27000 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d  3ExprIfTrue, jum
27010 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
27030 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27040 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
27050 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
27060 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
27070 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
27080 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
27090 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
270a0 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
270b0 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
270c0 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
270d0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
270e0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
270f0 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
27100 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27110 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
27120 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
27130 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
27140 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
27150 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
27160 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27170 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
27180 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a    default_expr:.
27190 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
271a0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
271b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
271c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
271d0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
271e0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
271f0 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
27200 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
27210 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
27220 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
27230 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
27240 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27250 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27270 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
27280 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
27290 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
272a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
272b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
272c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
272d0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
272e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
272f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
27300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27310 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27320 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27330 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
27340 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27350 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27360 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
27370 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
27380 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
27390 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
273a0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
273b0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
273c0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
273d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
273e0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
273f0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
27400 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
27410 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
27420 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
27430 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
27440 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
27450 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
27460 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
27470 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
27480 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
27490 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
274a0 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
274b0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
274c0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
274d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
274e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
274f0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
27500 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
27510 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
27520 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
27530 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
27540 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
27550 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
27560 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
27570 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
27580 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
27590 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
275a0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
275b0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
275c0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
275d0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
275e0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
275f0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
27600 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
27610 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
27620 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
27630 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
27640 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
27650 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
27660 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
27670 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
27680 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
27690 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
276a0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
276b0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
276c0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
276d0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
276e0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
276f0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
27700 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
27710 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
27720 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
27730 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
27740 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
27750 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
27760 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
27770 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
27780 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
27790 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
277a0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
277b0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
277c0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
277d0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
277e0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
277f0 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
27800 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
27810 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
27820 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
27830 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
27840 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
27850 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
27860 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
27870 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
27880 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
27890 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
278a0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
278b0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
278c0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
278d0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
278e0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
278f0 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
27900 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
27910 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
27920 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
27930 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
27940 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
27950 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
27960 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
27970 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
27980 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27990 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
279a0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
279b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
279c0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
279d0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
279e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
279f0 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
27a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27a10 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
27a20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
27a30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27a40 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
27a50 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
27a60 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27a70 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
27a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27a90 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
27aa0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
27ab0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
27ac0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
27ad0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
27ae0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27af0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27b00 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27b10 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27b20 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
27b30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27b40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27b50 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b  >eX==EX_Right );
27b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27b70 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
27b80 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
27b90 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27ba0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27bb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27bc0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
27bd0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
27be0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27bf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27c00 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27c10 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27c20 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27c30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27c40 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
27c50 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
27c60 4c 4c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  LL);.      asser
27c70 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
27c80 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  _Right );.      
27c90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27ca0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27cb0 2d 3e 78 2e 70 52 69 67 68 74 2c 20 64 65 73 74  ->x.pRight, dest
27cc0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27cd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27ce0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27cf0 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
27d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27d10 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
27d20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27d30 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27d40 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
27d50 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
27d60 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27d70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27d80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27d90 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
27da0 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  H: {.      int i
27db0 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f  sNot;   /* IS NO
27dc0 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  T TRUE or IS NOT
27dd0 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
27de0 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f 2a 20  int isTrue;  /* 
27df0 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  IS TRUE or IS NO
27e00 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
27e10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27e20 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27e30 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e   isNot = pExpr->
27e40 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20  op2==TK_ISNOT;. 
27e50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
27e60 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74  pr->eX==EX_Right
27e70 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65   );.      isTrue
27e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
27e90 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
27ea0 78 2e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  x.pRight);.     
27eb0 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
27ec0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
27ed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
27ee0 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
27ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
27f00 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
27f10 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
27f20 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
27f30 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
27f40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27f50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27f60 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f80 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
27f90 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
27fa0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
27fb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27fc0 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
27fd0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
27fe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27ff0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28000 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28020 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28030 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28040 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28050 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28060 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28070 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
28080 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
28090 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
280a0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
280b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
280c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
280d0 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
280e0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
280f0 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
28100 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
28110 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
28120 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
28130 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
28140 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
28150 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
28160 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
28170 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
28180 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
28190 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
281a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
281b0 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
281c0 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
281d0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
281e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
281f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28200 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28210 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28220 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28230 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28250 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67  Expr->eX==EX_Rig
28260 68 74 20 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ht );.      r2 =
28270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28280 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
28290 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 26 72  pr->x.pRight, &r
282a0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
282b0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
282c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
282d0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
282e0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
282f0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
28300 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28310 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
28320 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
28330 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28340 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
28350 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
28360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28370 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
28380 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
28390 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
283a0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
283b0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
283c0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
283d0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
283e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
283f0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
28400 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
28410 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
28420 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
28430 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28440 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
28450 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
28460 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
28470 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
28480 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28490 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
284a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
284b0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
284c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
284d0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
284e0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
284f0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28500 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
28510 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
28520 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
28530 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28540 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
28550 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
28560 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28570 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28580 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28590 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
285a0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
285b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
285c0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
285d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
285e0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
285f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28600 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28610 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
28620 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
28630 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28640 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28650 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
28660 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
28670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28680 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
28690 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
286a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
286b0 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65  ISNULL );   Vdbe
286c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
286d0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
286e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
286f0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20  ==TK_NOTNULL ); 
28700 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28710 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
28720 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
28730 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28740 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28750 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28760 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
28770 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28780 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28790 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
287a0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
287b0 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33  r, dest, sqlite3
287c0 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d  ExprIfFalse, jum
287d0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
287e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
287f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28800 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
28810 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
28820 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
28830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28840 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
28850 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
28860 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
28870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28880 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
28890 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
288a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
288b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
288c0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
288d0 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
288e0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
288f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28900 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
28910 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
28920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28930 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
28940 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c  lt: {.    defaul
28950 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69  t_expr: .      i
28960 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
28970 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
28980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28990 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
289a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
289b0 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
289c0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
289d0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
289e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
289f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28a00 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28a10 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
28a20 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
28a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
28a40 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
28a50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28a60 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
28a70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
28a80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28a90 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28aa0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28ab0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28ae0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
28af0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
28b00 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
28b10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28b20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28b30 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
28b40 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
28b50 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70  rIfFalse() excep
28b60 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73  t that a copy is
28b70 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62   made of pExpr b
28b80 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65  efore.** code ge
28b90 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  neration, and th
28ba0 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74  at copy is delet
28bb0 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65  ed after code ge
28bc0 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a  neration. This.*
28bd0 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  * ensures that t
28be0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70  he original pExp
28bf0 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  r is unchanged..
28c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
28c10 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61  xprIfFalseDup(Pa
28c20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
28c30 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
28c40 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  st,int jumpIfNul
28c50 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
28c60 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28c70 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
28c80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
28c90 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
28ca0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28cb0 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  iled==0 ){.    s
28cc0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28cd0 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c  e(pParse, pCopy,
28ce0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28cf0 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
28d00 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
28d10 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pCopy);.}../*.**
28d20 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72   Expression pVar
28d30 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
28d40 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69  o be an SQL vari
28d50 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20  able. pExpr may 
28d60 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f  be any.** type o
28d70 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  f expression..**
28d80 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
28d90 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c  a simple SQL val
28da0 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c  ue - an integer,
28db0 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62   real, string, b
28dc0 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76  lob.** or NULL v
28dd0 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20  alue - then the 
28de0 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62  VDBE currently b
28df0 65 69 6e 67 20 70 72 65 70 61 72 65 64 20 69 73  eing prepared is
28e00 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
28e10 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65 61 63  o re-prepare eac
28e20 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c  h time a new val
28e30 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76  ue is bound to v
28e40 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a  ariable pVar..**
28e50 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
28e60 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  , if pExpr is a 
28e70 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65  simple SQL value
28e80 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
28e90 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  s the.** same as
28ea0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
28eb0 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
28ec0 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f  e pVar, non-zero
28ed0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
28ee0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
28ef0 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  he values are no
28f00 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66  t the same or if
28f10 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
28f20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61  simple.** SQL va
28f30 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74  lue, zero is ret
28f40 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
28f50 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65   int exprCompare
28f60 56 61 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a  Variable(Parse *
28f70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56  pParse, Expr *pV
28f80 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ar, Expr *pExpr)
28f90 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
28fa0 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73  .  int iVar;.  s
28fb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c  qlite3_value *pL
28fc0 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20  , *pR = 0;.  .  
28fd0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
28fe0 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
28ff0 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   pExpr, SQLITE_U
29000 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  TF8, SQLITE_AFF_
29010 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66  BLOB, &pR);.  if
29020 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72  ( pR ){.    iVar
29030 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e   = pVar->iColumn
29040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29050 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
29060 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
29070 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74  ;.    pL = sqlit
29080 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
29090 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70  lue(pParse->pRep
290a0 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51  repare, iVar, SQ
290b0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a  LITE_AFF_BLOB);.
290c0 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20      if( pL ){.  
290d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
290e0 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d  value_type(pL)==
290f0 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
29100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
29110 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f  alue_text(pL); /
29120 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
29130 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d  encoding is UTF-
29140 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  8 */.      }.   
29150 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c     res =  0==sql
29160 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
29170 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d  L, pR, 0);.    }
29180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
29190 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73  eFree(pR);.    s
291a0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
291b0 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pL);.  }..  retu
291c0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
291d0 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
291e0 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
291f0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
29200 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
29210 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
29220 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
29230 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
29240 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
29250 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
29260 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
29270 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
29280 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
29290 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
292a0 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
292b0 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
292c0 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
292d0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
292e0 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
292f0 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
29300 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
29310 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
29320 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
29330 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
29340 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
29350 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
29360 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
29370 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
29380 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
29390 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
293a0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
293b0 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
293c0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
293d0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
293e0 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
293f0 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
29400 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
29410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
29420 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
29430 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
29440 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
29450 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
29460 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
29470 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
29480 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
29490 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
294a0 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
294b0 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
294c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
294d0 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
294e0 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
294f0 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
29500 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
29510 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
29520 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
29530 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
29540 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
29550 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
29560 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
29570 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
29580 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
29590 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
295a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
295b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
295c0 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
295d0 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
295e0 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
295f0 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
29600 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
29610 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
29620 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
29630 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
29640 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
29650 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65  .**.** If pParse
29660 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
29670 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65  n TK_VARIABLE te
29680 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20 62  rms in pA with b
29690 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50  indings in.** pP
296a0 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
296b0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
296c0 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73  against literals
296d0 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a   in pB.  The .**
296e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
296f0 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20  expmask bitmask 
29700 69 73 20 75 70 64 61 74 65 64 20 66 6f 72 20 65  is updated for e
29710 61 63 68 20 76 61 72 69 61 62 6c 65 20 72 65 66  ach variable ref
29720 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70  erenced..** If p
29730 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74  Parse is NULL (t
29740 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20  he normal case) 
29750 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49  then any TK_VARI
29760 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a  ABLE term in .**
29770 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65   Argument pParse
29780 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
29790 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20   be NULL. If it 
297a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
297b0 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73  pA or.** pB caus
297c0 65 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75  es a return valu
297d0 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73  e of 2..*/.int s
297e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
297f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
29800 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20   Expr *pA, Expr 
29810 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
29820 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
29830 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
29840 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
29850 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
29860 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66   0 : 2;.  }.  if
29870 28 20 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e  ( pParse && pA->
29880 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
29890 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61  && exprCompareVa
298a0 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  riable(pParse, p
298b0 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65  A, pB) ){.    re
298c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f  turn 0;.  }.  co
298d0 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
298e0 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
298f0 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
29900 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
29910 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
29920 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
29930 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
29940 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
29950 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
29960 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
29970 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
29980 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
29990 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
299a0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
299b0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
299c0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
299d0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
299e0 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54   pA->pLeft,pB,iT
299f0 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
29a00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29a10 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
29a20 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
29a30 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29a40 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70  pParse, pA,pB->p
29a50 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a  Left,iTab)<2 ){.
29a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29a70 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
29a80 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
29a90 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
29aa0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  && pA->op!=TK_AG
29ab0 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  G_COLUMN && pA->
29ac0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
29ad0 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46  if( pA->op==TK_F
29ae0 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20  UNCTION ){.     
29af0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
29b00 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
29b10 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
29b20 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
29b30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e    }else if( pA->
29b40 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
29b50 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
29b60 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e  te3_stricmp(pA->
29b70 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
29b80 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
29b90 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
29ba0 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
29bb0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
29bc0 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
29bd0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
29be0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  }.  }.  if( (pA-
29bf0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
29c00 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
29c10 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
29c20 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
29c30 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
29c40 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f  nedFlags & EP_To
29c50 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a  kenOnly)==0) ){.
29c60 20 20 20 20 69 66 28 20 70 41 2d 3e 65 58 3d 3d      if( pA->eX==
29c70 45 58 5f 53 65 6c 65 63 74 20 7c 7c 20 70 41 2d  EX_Select || pA-
29c80 3e 65 58 21 3d 70 42 2d 3e 65 58 20 29 20 72 65  >eX!=pB->eX ) re
29c90 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
29ca0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
29cb0 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30   EP_FixedCol)==0
29cc0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
29cd0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29ce0 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70  se, pA->pLeft, p
29cf0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
29d00 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
29d10 69 66 28 20 70 41 2d 3e 65 58 3d 3d 45 58 5f 52  if( pA->eX==EX_R
29d20 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
29d30 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
29d40 70 61 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e  pare(pParse,pA->
29d50 78 2e 70 52 69 67 68 74 2c 70 42 2d 3e 78 2e 70  x.pRight,pB->x.p
29d60 52 69 67 68 74 2c 69 54 61 62 29 20 29 20 72 65  Right,iTab) ) re
29d70 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
29d80 20 20 69 66 28 20 70 41 2d 3e 65 58 3d 3d 45 58    if( pA->eX==EX
29d90 5f 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  _List ){.      i
29da0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
29db0 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
29dc0 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
29dd0 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
29de0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
29df0 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
29e00 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75  dFlags & EP_Redu
29e10 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ced)==0 );.    i
29e20 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  f( pA->op!=TK_ST
29e30 52 49 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d  RING && pA->op!=
29e40 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a  TK_TRUEFALSE ){.
29e50 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43        if( pA->iC
29e60 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
29e70 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  mn ) return 2;. 
29e80 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
29e90 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
29ea0 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
29eb0 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
29ec0 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
29ed0 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
29ee0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
29ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
29f00 4f 57 46 55 4e 43 0a 20 20 20 20 2f 2a 20 4a 75  OWFUNC.    /* Ju
29f10 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20  stification for 
29f20 74 68 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20  the assert():.  
29f30 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
29f40 74 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70  tions have p->op
29f50 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75  ==TK_FUNCTION bu
29f60 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
29f70 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 68 61 76  tions.    ** hav
29f80 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  e p->op==TK_AGG_
29f90 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e  FUNCTION.  So an
29fa0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  y comparison bet
29fb0 77 65 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74  ween an aggregat
29fc0 65 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e.    ** functio
29fd0 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66  n and a window f
29fe0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68  unction should h
29ff0 61 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72  ave failed befor
2a000 65 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 2a  e reaching.    *
2a010 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 41  * this point.  A
2a020 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  nd, it is not po
2a030 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
2a040 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a050 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 73 63   and.    ** a sc
2a060 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69  alar function wi
2a070 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2a080 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61   and number of a
2a090 72 67 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20  rguments.  So.  
2a0a0 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68    ** if we reach
2a0b0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74   this point, eit
2a0c0 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68  her A and B both
2a0d0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a0e0 73 20 6f 72 0a 20 20 20 20 2a 2a 20 6e 65 69 74  s or.    ** neit
2a0f0 68 65 72 20 61 72 65 20 61 20 77 69 6e 64 6f 77  her are a window
2a100 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20   functions. */. 
2a110 20 20 20 61 73 73 65 72 74 28 20 28 70 41 2d 3e     assert( (pA->
2a120 70 57 69 6e 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70  pWin==0)==(pB->p
2a130 57 69 6e 3d 3d 30 29 20 29 3b 0a 0a 20 20 20 20  Win==0) );..    
2a140 69 66 28 20 70 41 2d 3e 70 57 69 6e 21 3d 30 20  if( pA->pWin!=0 
2a150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
2a160 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
2a170 65 28 70 50 61 72 73 65 2c 70 41 2d 3e 70 57 69  e(pParse,pA->pWi
2a180 6e 2c 70 42 2d 3e 70 57 69 6e 29 21 3d 30 20 29  n,pB->pWin)!=0 )
2a190 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
2a1a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
2a1b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a1c0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
2a1d0 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
2a1e0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
2a1f0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
2a200 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
2a210 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
2a220 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
2a230 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
2a240 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
2a250 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
2a260 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
2a270 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
2a280 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
2a290 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
2a2a0 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
2a2b0 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
2a2c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a2d0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
2a2e0 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
2a2f0 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
2a300 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
2a310 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
2a320 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
2a330 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
2a340 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
2a350 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
2a360 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
2a370 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
2a380 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
2a390 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
2a3a0 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
2a3b0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
2a3c0 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
2a3d0 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
2a3e0 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
2a3f0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
2a400 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
2a410 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
2a420 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2a430 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2a440 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
2a450 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
2a460 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
2a470 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
2a480 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
2a490 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
2a4a0 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
2a4b0 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
2a4c0 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
2a4d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
2a4e0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
2a4f0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
2a500 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
2a510 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2a520 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
2a530 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
2a540 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
2a550 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
2a560 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
2a570 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
2a580 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2a590 70 61 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20  pare(0, pExprA, 
2a5a0 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
2a5b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a5c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2a5d0 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45  ** Like sqlite3E
2a5e0 78 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63  xprCompare() exc
2a5f0 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ept COLLATE oper
2a600 61 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70  ators at the top
2a610 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67  -level.** are ig
2a620 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2a630 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2a640 53 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45  Skip(Expr *pA, E
2a650 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
2a660 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
2a670 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a680 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2a690 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2a6a0 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20  ollate(pA),.    
2a6b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a6c0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2a6d0 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pB),.           
2a6e0 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a    iTab);.}../*.*
2a6f0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a700 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
2a710 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
2a720 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
2a730 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
2a740 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
2a750 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
2a760 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
2a770 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
2a780 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
2a790 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
2a7a0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
2a7b0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
2a7c0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2a7d0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
2a7e0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
2a800 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
2a810 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
2a820 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
2a830 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
2a840 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
2a850 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
2a860 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
2a870 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2a880 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
2a890 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
2a8a0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
2a8b0 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2a8c0 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
2a8d0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2a8e0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
2a8f0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
2a900 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
2a910 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2a920 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
2a930 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
2a940 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
2a950 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
2a960 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
2a970 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
2a980 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
2a990 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
2a9a0 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
2a9b0 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69  *.** If pParse i
2a9c0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2a9d0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
2a9e0 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69  ound variables i
2a9f0 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f  n pE1 are .** co
2aa00 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c  mpared against l
2aa10 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e  iteral values in
2aa20 20 70 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d   pE2 and pParse-
2aa30 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
2aa40 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  is.** modified t
2aa50 6f 20 72 65 63 6f 72 64 20 77 68 69 63 68 20 62  o record which b
2aa60 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61  ound variables a
2aa70 72 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20  re referenced.  
2aa80 49 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73  If pParse .** is
2aa90 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73   NULL, then fals
2aaa0 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  e will be return
2aab0 65 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69  ed if pE1 contai
2aac0 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72  ns any bound var
2aad0 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  iables..**.** Wh
2aae0 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
2aaf0 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
2ab00 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
2ab10 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
2ab20 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
2ab30 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
2ab40 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
2ab50 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
2ab60 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
2ab70 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
2ab80 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
2ab90 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
2aba0 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
2abb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2abc0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2abd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2abe0 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
2abf0 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
2ac00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ac10 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
2ac20 20 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29   pE1, pE2, iTab)
2ac30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ac40 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
2ac50 74 28 20 70 45 32 2d 3e 6f 70 21 3d 54 4b 5f 4f  t( pE2->op!=TK_O
2ac60 52 20 7c 7c 20 70 45 32 2d 3e 65 58 3d 3d 45 58  R || pE2->eX==EX
2ac70 5f 52 69 67 68 74 20 29 3b 0a 20 20 69 66 28 20  _Right );.  if( 
2ac80 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
2ac90 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
2aca0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
2acb0 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70  rse, pE1, pE2->p
2acc0 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
2acd0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2ace0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2acf0 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2ad00 70 45 32 2d 3e 78 2e 70 52 69 67 68 74 2c 20 69  pE2->x.pRight, i
2ad10 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
2ad20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2ad30 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2ad40 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  NOTNULL && pE1->
2ad50 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
2ad60 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20   pE1->op!=TK_IS 
2ad70 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
2ad80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2ad90 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c  pCollate(pE1->pL
2ada0 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eft);.    testca
2adb0 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65  se( pX!=pE1->pLe
2adc0 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ft );.    if( sq
2add0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ade0 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45 32  (pParse, pX, pE2
2adf0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
2ae00 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2ae10 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ae20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
2ae30 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61 6c  he Expr node cal
2ae40 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65  lback for sqlite
2ae50 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e  3ExprImpliesNotN
2ae60 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66 20  ullRow()..** If 
2ae70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2ae80 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ode requires tha
2ae90 74 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 70  t the table at p
2aea0 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a 20  Walker->iCur.** 
2aeb0 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  have a non-NULL 
2aec0 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65 74  column, then set
2aed0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2aee0 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e 0a  to 1 and abort..
2aef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d  */.static int im
2af00 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28  pliesNotNullRow(
2af10 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2af20 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2af30 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2af40 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2af50 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
2af60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
2af70 20 73 6f 20 69 74 0a 20 20 2a 2a 20 63 61 6e 6e   so it.  ** cann
2af80 6f 74 20 68 61 76 65 20 61 6e 79 20 54 4b 5f 41  ot have any TK_A
2af90 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e 74 72 69 65  GG_COLUMN entrie
2afa0 73 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  s because those 
2afb0 61 72 65 20 6f 6e 6c 79 20 66 6f 75 6e 64 0a 20  are only found. 
2afc0 20 2a 2a 20 69 6e 20 48 41 56 49 4e 47 20 63 6c   ** in HAVING cl
2afd0 61 75 73 65 73 2e 20 20 57 65 20 63 61 6e 20 67  auses.  We can g
2afe0 65 74 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  et a TK_AGG_FUNC
2aff0 54 49 4f 4e 20 69 6e 20 61 20 57 48 45 52 45 20  TION in a WHERE 
2b000 63 6c 61 75 73 65 2c 0a 20 20 2a 2a 20 62 75 74  clause,.  ** but
2b010 20 74 68 61 74 20 69 73 20 61 6e 20 69 6c 6c 65   that is an ille
2b020 67 61 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  gal construct an
2b030 64 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  d the query will
2b040 20 62 65 20 72 65 6a 65 63 74 65 64 20 61 74 0a   be rejected at.
2b050 20 20 2a 2a 20 61 20 6c 61 74 65 72 20 73 74 61    ** a later sta
2b060 67 65 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  ge of processing
2b070 2c 20 73 6f 20 74 68 65 20 54 4b 5f 41 47 47 5f  , so the TK_AGG_
2b080 46 55 4e 43 54 49 4f 4e 20 63 61 73 65 20 64 6f  FUNCTION case do
2b090 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 65 64  es not.  ** need
2b0a0 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
2b0b0 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 61 73 73  d here. */.  ass
2b0c0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
2b0d0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2b0e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
2b0f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2b100 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a 20 20 69 66  UNCTION );..  if
2b110 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2b120 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
2b130 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 57  Join) ) return W
2b140 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69 74  RC_Prune;.  swit
2b150 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2b160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2b170 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
2b180 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2b190 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2b1a0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
2b1b0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
2b1c0 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20 20 63  e TK_CASE:.    c
2b1d0 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
2b1e0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
2b1f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b200 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2b210 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  SNOT );.      te
2b220 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b230 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
2b240 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b250 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pr->op==TK_ISNUL
2b260 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
2b270 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b280 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
2b290 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b2a0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
2b2b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b2c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  pr->op==TK_CASE 
2b2d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b2e0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2b2f0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
2b300 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2b310 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
2b320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2b330 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73  C_Prune;.    cas
2b340 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
2b350 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
2b360 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69  u.iCur==pExpr->i
2b370 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
2b380 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2b390 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2b3a0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2b3c0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a  urn WRC_Prune;..
2b3d0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
2b3e0 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  ables are allowe
2b3f0 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74 72 61  d to use constra
2b400 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c  ints like x=NULL
2b410 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61 20 74  .  So.    ** a t
2b420 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
2b430 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  x=y does not pro
2b440 76 65 20 74 68 61 74 20 79 20 69 73 20 6e 6f 74  ve that y is not
2b450 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20 20 2a   null if x.    *
2b460 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * is the column 
2b470 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
2b480 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  le */.    case T
2b490 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54  K_EQ:.    case T
2b4a0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
2b4b0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
2b4c0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
2b4d0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
2b4e0 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65 73 74  K_GE:.      test
2b4f0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b500 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
2b510 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b520 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
2b530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b540 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29  xpr->op==TK_LT )
2b550 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2b560 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b570 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
2b580 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b590 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
2b5a0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b5b0 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op==TK_GE );.  
2b5c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
2b5d0 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20  r->eX==EX_Right 
2b5e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45  );.      if( (pE
2b5f0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
2b600 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2b610 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c  irtual(pExpr->pL
2b620 65 66 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20  eft->pTab)).    
2b630 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 78 2e     || (pExpr->x.
2b640 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
2b650 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75  OLUMN && IsVirtu
2b660 61 6c 28 70 45 78 70 72 2d 3e 78 2e 70 52 69 67  al(pExpr->x.pRig
2b670 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20 20  ht->pTab)).     
2b680 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72   ){.       retur
2b690 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2b6a0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2b6b0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  :.      return W
2b6c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
2b6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b6e0 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
2b6f0 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2b700 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75   can only be tru
2b710 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a  e if at least.**
2b720 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
2b730 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e  able iTab is non
2b740 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72  -null.  In other
2b750 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74   words, return t
2b760 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73  rue.** if expres
2b770 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61  sion p will alwa
2b780 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61  ys be NULL or fa
2b790 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c  lse if every col
2b7a0 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69  umn of iTab.** i
2b7b0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61  s NULL..**.** Fa
2b7c0 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61 72  lse negatives ar
2b7d0 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49  e acceptable.  I
2b7e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
2b7f0 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72  t is ok to retur
2b800 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69  n.** zero even i
2b810 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77  f expression p w
2b820 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75  ill never be tru
2b830 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  e of every colum
2b840 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20  n of iTab.** is 
2b850 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e  NULL.  A false n
2b860 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c  egative is merel
2b870 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d  y a missed optim
2b880 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e  ization opportun
2b890 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ity..**.** False
2b8a0 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e   positives are n
2b8b0 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65  ot allowed, howe
2b8c0 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ver.  A false po
2b8d0 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c  sitive may resul
2b8e0 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72  t.** in an incor
2b8f0 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a  rect answer..**.
2b900 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68  ** Terms of p th
2b910 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69  at are marked wi
2b920 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28  th EP_FromJoin (
2b930 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 63  and hence that c
2b940 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ome from.** the 
2b950 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b960 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e  ses of LEFT JOIN
2b970 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  S) are excluded 
2b980 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69  from the analysi
2b990 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2b9a0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
2b9b0 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54   check if a LEFT
2b9c0 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e   JOIN can be con
2b9d0 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  verted into.** a
2b9e0 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
2b9f0 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74    The p argument
2ba00 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63 6c   is the WHERE cl
2ba10 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57 48  ause.  If the WH
2ba20 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65  ERE.** clause re
2ba30 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65  quires that some
2ba40 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
2ba50 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
2ba60 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62  e LEFT JOIN.** b
2ba70 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  e non-NULL, then
2ba80 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63   the LEFT JOIN c
2ba90 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e  an be safely con
2baa0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a  verted into an.*
2bab0 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e  * ordinary join.
2bac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2bad0 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
2bae0 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e  lRow(Expr *p, in
2baf0 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65  t iTab){.  Walke
2bb00 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2bb10 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73  llback = implies
2bb20 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e  NotNullRow;.  w.
2bb30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2bb40 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  = 0;.  w.xSelect
2bb50 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2bb60 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20   w.eCode = 0;.  
2bb70 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b  w.u.iCur = iTab;
2bb80 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2bb90 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
2bba0 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
2bbb0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2bbc0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2bbd0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2bbe0 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2bbf0 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
2bc00 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
2bc10 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
2bc20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
2bc30 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
2bc40 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
2bc50 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
2bc60 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
2bc70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2bc80 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
2bc90 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
2bca0 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
2bcb0 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
2bcc0 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
2bcd0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
2bce0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
2bcf0 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
2bd00 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
2bd10 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2bd20 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
2bd30 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
2bd40 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
2bd50 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2bd60 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
2bd70 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
2bd80 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
2bd90 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
2bda0 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
2bdb0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2bdc0 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
2bdd0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2bde0 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
2bdf0 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
2be00 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
2be10 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
2be20 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
2be30 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
2be40 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
2be50 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2be60 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2be70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
2be80 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
2be90 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
2bea0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
2beb0 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
2bec0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
2bed0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2bee0 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
2bef0 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
2bf00 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2bf10 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
2bf20 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
2bf30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2bf40 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2bf50 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
2bf60 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
2bf70 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
2bf80 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
2bf90 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
2bfa0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
2bfb0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2bfc0 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
2bfd0 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2bfe0 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
2bff0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2c000 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
2c010 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
2c020 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
2c030 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
2c040 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
2c050 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
2c060 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
2c070 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
2c080 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
2c090 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
2c0a0 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
2c0b0 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
2c0c0 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
2c0d0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2c0e0 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
2c0f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2c100 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
2c110 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
2c120 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2c130 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2c140 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
2c150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c160 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2c170 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
2c180 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
2c190 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2c1a0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2c1b0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
2c1c0 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
2c1d0 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
2c1e0 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
2c1f0 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
2c200 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
2c210 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
2c220 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
2c230 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
2c240 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c250 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
2c260 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
2c270 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
2c280 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2c290 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
2c2a0 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
2c2b0 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2c2c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2c2d0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
2c2e0 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
2c2f0 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
2c300 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
2c310 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
2c320 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
2c330 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
2c340 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
2c350 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
2c360 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
2c370 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
2c380 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
2c390 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2c3a0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2c3b0 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
2c3c0 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
2c3d0 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
2c3e0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
2c3f0 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
2c400 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2c410 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2c420 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
2c430 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
2c440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2c450 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2c460 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
2c470 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
2c480 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
2c490 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2c4a0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
2c4b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2c4c0 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
2c4d0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2c4e0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2c4f0 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
2c500 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
2c510 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
2c520 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2c530 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
2c540 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
2c550 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
2c560 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2c570 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
2c580 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
2c590 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
2c5a0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
2c5b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
2c5c0 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
2c5d0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2c5e0 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
2c5f0 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
2c600 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
2c610 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
2c620 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
2c630 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2c640 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
2c650 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
2c660 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2c670 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
2c680 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
2c690 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
2c6a0 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
2c6b0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2c6c0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2c6d0 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
2c6e0 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
2c6f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c700 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
2c710 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2c720 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
2c730 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
2c740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c750 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
2c760 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
2c770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
2c780 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
2c790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2c7a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2c7b0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
2c7c0 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
2c7d0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
2c7e0 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
2c7f0 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
2c800 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
2c810 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
2c820 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
2c830 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
2c840 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
2c850 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
2c860 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
2c870 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
2c880 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
2c890 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
2c8a0 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
2c8b0 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
2c8c0 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
2c8d0 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
2c8e0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
2c8f0 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
2c900 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
2c910 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2c920 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
2c930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
2c940 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
2c950 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45  NCTION );.  w.xE
2c960 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2c970 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
2c980 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2c990 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  = 0;.  w.u.pSrcC
2c9a0 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
2c9b0 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
2c9c0 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
2c9d0 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
2c9e0 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
2c9f0 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
2ca00 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
2ca10 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
2ca20 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
2ca30 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
2ca40 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2ca50 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2ca60 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
2ca70 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2ca80 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2ca90 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2caa0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2cab0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2cac0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2cad0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
2cae0 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
2caf0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2cb00 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2cb10 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
2cb20 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2cb30 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
2cb40 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
2cb50 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
2cb60 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
2cb70 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2cb80 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
2cb90 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2cba0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2cbb0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2cbc0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
2cbd0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
2cbe0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
2cbf0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
2cc00 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
2cc10 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2cc20 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
2cc30 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2cc40 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
2cc50 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
2cc60 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2cc70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2cc80 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
2cc90 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
2cca0 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
2ccb0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
2ccc0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
2ccd0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
2cce0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2ccf0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
2cd00 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
2cd10 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
2cd20 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
2cd30 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
2cd40 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
2cd50 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
2cd60 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
2cd70 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2cd80 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
2cd90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2cda0 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
2cdb0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2cdc0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2cdd0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2cde0 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
2cdf0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2ce00 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
2ce10 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
2ce20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
2ce30 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
2ce40 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
2ce50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
2ce60 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
2ce70 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
2ce80 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
2ce90 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e   pNC->uNC.pAggIn
2cea0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  fo;..  assert( p
2ceb0 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2cec0 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73  _UAggInfo );.  s
2ced0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2cee0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2cef0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
2cf00 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2cf10 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2cf20 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2cf30 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
2cf40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2cf50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2cf60 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
2cf70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2cf80 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
2cf90 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
2cfa0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2cfb0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2cfc0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2cfd0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
2cfe0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
2cff0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
2d000 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d010 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
2d020 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
2d030 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
2d040 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2d050 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d060 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2d070 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
2d080 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d090 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2d0a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2d0b0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2d0c0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
2d0d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2d0e0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2d0f0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
2d100 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2d110 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2d120 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
2d130 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
2d140 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2d150 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
2d160 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2d170 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2d180 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
2d190 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2d1a0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
2d1b0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
2d1c0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
2d1d0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
2d1e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2d1f0 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
2d200 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2d210 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d220 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
2d230 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2d240 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
2d250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2d260 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
2d270 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
2d280 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
2d290 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2d2a0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2d2b0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d2d0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
2d2e0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2d300 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2d310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d320 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2d330 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
2d340 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
2d350 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
2d360 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2d370 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2d380 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
2d390 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d3a0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
2d3b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
2d3c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2d3d0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
2d3e0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
2d3f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d400 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2d410 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2d420 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2d430 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2d440 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2d450 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2d460 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d480 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d490 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2d4a0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2d4b0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2d4c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2d4d0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2d4e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d4f0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2d510 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2d520 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2d530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d540 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2d550 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2d560 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2d570 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2d580 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2d590 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2d5a0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2d5b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2d5c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2d5d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5f0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2d600 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2d610 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2d620 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2d630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2d640 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2d650 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2d680 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2d6a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2d6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d6d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d6e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2d6f0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2d700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d710 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2d720 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2d730 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2d740 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2d750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d770 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2d780 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2d790 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2d7a0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2d7c0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2d7d0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2d7e0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2d7f0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2d800 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2d810 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2d820 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2d830 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2d840 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2d850 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2d860 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2d870 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d880 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2d890 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2d8a0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d8b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d8c0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2d8d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2d8e0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2d8f0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2d900 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d910 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2d920 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d930 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2d940 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2d950 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2d960 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2d970 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2d980 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2d990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2d9a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2d9b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2d9c0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2d9d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2d9e0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2d9f0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2da00 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2da10 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2da20 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2da30 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2da40 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2da50 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2da60 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2da70 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2da80 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2da90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2daa0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2dab0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2dac0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2dad0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2dae0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2daf0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2db00 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2db10 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2db20 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2db30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2db40 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2db50 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2db60 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2db70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2db80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2db90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2dba0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2dbb0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2dbc0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2dbd0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2dbe0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2dbf0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2dc00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2dc10 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2dc20 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2dc30 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2dc40 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2dc50 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2dc60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dc70 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2dc80 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
2dc90 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 7c  r->eX==EX_List |
2dca0 7c 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  | pExpr->eX==EX_
2dcb0 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 20 20  None );.        
2dcc0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
2dcd0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
2dce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2dcf0 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2dd00 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
2dd10 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
2dd20 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2dd30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dd40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2dd50 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
2dd60 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2dd70 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
2dd80 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
2dd90 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
2dda0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2ddb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
2ddc0 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20  zToken, .       
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2dde0 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 3f  r->eX==EX_List ?
2ddf0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2de00 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
2de10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2de20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
2de30 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
2de40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2de50 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2de60 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2de70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2de80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2de90 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2dea0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2deb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ded0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2dee0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
2def0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
2df00 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2df10 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
2df20 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2df30 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2df40 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2df50 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2df60 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
2df70 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2df80 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
2df90 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45  uce);.        pE
2dfa0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2dfb0 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  )i;.        pExp
2dfc0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
2dfd0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
2dfe0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2dff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e000 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2e010 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
2e020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2e030 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2e040 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nue;.}.static in
2e050 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
2e060 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b  tesInSelect(Walk
2e070 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2e080 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2e090 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e0a0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2e0b0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2e0c0 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57  th++;.  return W
2e0d0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
2e0e0 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
2e0f0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2e100 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a  lectEnd(Walker *
2e110 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2e120 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2e130 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2e140 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2e150 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d  r->walkerDepth--
2e160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
2e170 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
2e180 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
2e190 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
2e1a0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
2e1b0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
2e1c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
2e1d0 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
2e1e0 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
2e1f0 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
2e200 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
2e210 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
2e220 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
2e230 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
2e240 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
2e250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2e260 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2e270 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
2e280 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
2e290 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
2e2a0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
2e2b0 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
2e2c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2e2d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2e2e0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2e2f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2e300 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2e310 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2e320 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2e330 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2e340 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
2e350 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2e360 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2e370 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a  llback2 = analyz
2e380 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2e390 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b  ectEnd;.  w.walk
2e3a0 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77  erDepth = 0;.  w
2e3b0 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
2e3c0 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
2e3d0 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
2e3e0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2e3f0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
2e400 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
2e410 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2e420 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
2e430 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2e440 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
2e450 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
2e460 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2e470 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
2e480 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
2e490 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
2e4a0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
2e4b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
2e4c0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
2e4d0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2e4e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
2e4f0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
2e500 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2e510 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2e520 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
2e530 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
2e540 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2e550 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
2e560 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2e570 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2e580 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
2e590 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
2e5a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2e5b0 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
2e5c0 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
2e5d0 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
2e5e0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
2e5f0 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
2e600 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2e610 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2e620 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
2e630 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
2e640 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
2e650 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
2e660 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
2e670 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
2e680 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
2e690 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2e6a0 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
2e6b0 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
2e6c0 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
2e6d0 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
2e6e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e6f0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
2e700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2e710 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
2e720 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
2e730 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
2e740 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
2e750 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  eg) ){.    pPars
2e760 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
2e770 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
2e780 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2e790 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
2e7a0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
2e7b0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
2e7c0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
2e7d0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2e7e0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2e7f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2e800 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2e810 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d   n;.  if( nReg==
2e820 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
2e830 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2e840 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72  rse);.  i = pPar
2e850 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2e860 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2e870 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2e880 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61  eg<=n ){.    pPa
2e890 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
2e8a0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2e8b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
2e8c0 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
2e8d0 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
2e8e0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
2e8f0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
2e900 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
2e910 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
2e920 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2e930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e940 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
2e950 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d  eg){.  if( nReg=
2e960 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
2e970 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2e980 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20  pParse, iReg);. 
2e990 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2e9a0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
2e9b0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
2e9c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2e9d0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
2e9e0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2e9f0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
2ea00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
2ea10 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2ea20 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
2ea30 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2ea40 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
2ea50 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2ea60 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
2ea70 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
2ea80 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
2ea90 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2eaa0 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2eab0 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f  Validate that no
2eac0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2ead0 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e  ter falls within
2eae0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
2eaf0 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20   iFirst..iLast, 
2eb00 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73  inclusive.  This
2eb10 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2eb20 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69   call from withi
2eb30 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  n assert().** st
2eb40 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66  atements..*/.#if
2eb50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2eb60 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65  .int sqlite3NoTe
2eb70 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65  mpsInRange(Parse
2eb80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
2eb90 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29  irst, int iLast)
2eba0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2ebb0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2ebc0 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73  eg>0.   && pPars
2ebd0 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61  e->iRangeReg+pPa
2ebe0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e  rse->nRangeReg >
2ebf0 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50   iFirst.   && pP
2ec00 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2ec10 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20  <= iLast.  ){.  
2ec20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2ec30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2ec40 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2ec50 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2ec60 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2ec70 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2ec80 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2ec90 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2eca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2ecb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2ecc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2ecd0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.