/ Hex Artifact Content
Login

Artifact 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 38  /*.** 2015-06-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44  hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  BE code used to 
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57  process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53  HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77  *.** This file w
01f0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  as originally pa
0200: 72 74 20 6f 66 20 77 68 65 72 65 2e 63 20 62 75  rt of where.c bu
0210: 74 20 77 61 73 20 73 70 6c 69 74 20 6f 75 74 20  t was split out 
0220: 74 6f 20 69 6d 70 72 6f 76 65 0a 2a 2a 20 72 65  to improve.** re
0230: 61 64 61 62 69 6c 69 74 79 20 61 6e 64 20 65 64  adability and ed
0240: 69 74 61 62 69 6c 69 69 74 79 2e 20 20 54 68 69  itabiliity.  Thi
0250: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0260: 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  utility routines
0270: 20 66 6f 72 0a 2a 2a 20 61 6e 61 6c 79 7a 69 6e   for.** analyzin
0280: 67 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 69  g Expr objects i
0290: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
02a0: 73 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  se..*/.#include 
02b0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02c0: 6e 63 6c 75 64 65 20 22 77 68 65 72 65 49 6e 74  nclude "whereInt
02d0: 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .h"../* Forward 
02e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  declarations */.
02f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
0300: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
0310: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
0320: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  int);../*.** Dea
0330: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
0340: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
0350: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
0360: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
0370: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
0380: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
0390: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
03a0: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
03b0: 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61  3WhereClauseClea
03c0: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
03d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
03e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
03f0: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
0400: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
0410: 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  h a WhereAndInfo
0420: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
0430: 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64  ic void whereAnd
0440: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
0450: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64  e3 *db, WhereAnd
0460: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Info *p){.  sqli
0470: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
0480: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
0490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
04a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   p);.}../*.** Ad
04b0: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
04c0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
04d0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
04e0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
04f0: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
0500: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
0510: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
0520: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
0530: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
0540: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
0550: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
0560: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
0570: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
0580: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
0590: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
05a0: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
05b0: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
05c0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
05d0: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
05e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
05f0: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
0600: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
0610: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
0620: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
0630: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
0640: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
0650: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
0660: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
0670: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
0680: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
0690: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
06a0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
06b0: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
06c0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
06d0: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
06e0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
06f0: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
0700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
0710: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
0720: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
0730: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
0740: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
0750: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
0760: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
0770: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
0780: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
0790: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
07a0: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
07b0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
07c0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
07d0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
07e0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
07f0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
0800: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
0810: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
0820: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
0830: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
0840: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
0850: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
0860: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
0870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0880: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
0890: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
08a0: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 31 36  WC, Expr *p, u16
08b0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
08c0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
08d0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
08e0: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
08f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
0900: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
0910: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
0920: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
0930: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
0940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
0950: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
0960: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
0970: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
0980: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
0990: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
09a0: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
09b0: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
09c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
09d0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
09e0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
09f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a00: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
0a10: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
0a20: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
0a40: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
0a50: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
0a60: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
0a70: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
0a80: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
0a90: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c  e3DbFree(db, pOl
0ab0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
0ac0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74  C->nSlot = sqlit
0ad0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
0ae0: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f  b, pWC->a)/sizeo
0af0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20  f(pWC->a[0]);.  
0b00: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
0b10: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
0b20: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 70  Term++];.  if( p
0b30: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0b40: 72 74 79 28 70 2c 20 45 50 5f 55 6e 6c 69 6b 65  rty(p, EP_Unlike
0b50: 6c 79 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ly) ){.    pTerm
0b60: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 73 71  ->truthProb = sq
0b70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 69  lite3LogEst(p->i
0b80: 54 61 62 6c 65 29 20 2d 20 32 37 30 3b 0a 20 20  Table) - 270;.  
0b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
0ba0: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 31 3b  ->truthProb = 1;
0bb0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 45  .  }.  pTerm->pE
0bc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
0bd0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
0be0: 69 6b 65 6c 79 28 70 29 3b 0a 20 20 70 54 65 72  ikely(p);.  pTer
0bf0: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
0c00: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
0c10: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
0c20: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
0c30: 0a 20 20 6d 65 6d 73 65 74 28 26 70 54 65 72 6d  .  memset(&pTerm
0c40: 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 30 2c 0a  ->eOperator, 0,.
0c50: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
0c60: 57 68 65 72 65 54 65 72 6d 29 20 2d 20 6f 66 66  WhereTerm) - off
0c70: 73 65 74 6f 66 28 57 68 65 72 65 54 65 72 6d 2c  setof(WhereTerm,
0c80: 65 4f 70 65 72 61 74 6f 72 29 29 3b 0a 20 20 72  eOperator));.  r
0c90: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
0ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
0cb0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
0cc0: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
0cd0: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
0ce0: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
0cf0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
0d00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
0d10: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
0d20: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
0d30: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
0d40: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49  , "<=", ">=", "I
0d50: 4e 22 2c 20 22 49 53 22 2c 20 61 6e 64 20 22 49  N", "IS", and "I
0d60: 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69  S NULL".*/.stati
0d70: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
0d80: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
0d90: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
0da0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
0db0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
0dc0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
0dd0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
0de0: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
0df0: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
0e00: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
0e10: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
0e20: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
0e30: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
0e40: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
0e50: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p==TK_ISNULL || 
0e60: 6f 70 3d 3d 54 4b 5f 49 53 3b 0a 7d 0a 0a 2f 2a  op==TK_IS;.}../*
0e70: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
0e80: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
0e90: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
0ea0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
0eb0: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
0ec0: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
0ed0: 20 58 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   X"..*/.static u
0ee0: 31 36 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  16 exprCommute(P
0ef0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0f00: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
0f10: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ( pExpr->pLeft->
0f20: 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 0a 20 20  op==TK_VECTOR.  
0f30: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 52 69 67 68   || pExpr->pRigh
0f40: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52  t->op==TK_VECTOR
0f50: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  .   || sqlite3Bi
0f60: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
0f70: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
0f80: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
0f90: 70 52 69 67 68 74 29 20 21 3d 0a 20 20 20 20 20  pRight) !=.     
0fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
0fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
0fc0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
0fd0: 68 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ht, pExpr->pLeft
0fe0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72  ).  ){.    pExpr
0ff0: 2d 3e 66 6c 61 67 73 20 5e 3d 20 45 50 5f 43 6f  ->flags ^= EP_Co
1000: 6d 6d 75 74 65 64 3b 0a 20 20 7d 0a 20 20 53 57  mmuted;.  }.  SW
1010: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
1020: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
1030: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
1040: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
1050: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1060: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
1070: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
1080: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
1090: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
10a0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
10b0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
10c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
10d0: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
10e0: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
10f0: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
1100: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
1110: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
1120: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1130: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  0;.}../*.** Tran
1140: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
1150: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
1160: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
1170: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
1180: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
1190: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
11a0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
11b0: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
11c0: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
11d0: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
11e0: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
11f0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
1200: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NULL;.  }else if
1210: 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a 20  ( op==TK_IS ){. 
1220: 20 20 20 63 20 3d 20 57 4f 5f 49 53 3b 0a 20 20     c = WO_IS;.  
1230: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1240: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
1250: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
1260: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
1270: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
1280: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
1290: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
12a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
12b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
12c0: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
12d0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
12e0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
12f0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
1300: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
1310: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
1320: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
1330: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
1340: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
1350: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
1360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
1370: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
1380: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1390: 6f 70 21 3d 54 4b 5f 49 53 20 7c 7c 20 63 3d 3d  op!=TK_IS || c==
13a0: 57 4f 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72  WO_IS );.  retur
13b0: 6e 20 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  n c;.}...#ifndef
13c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
13d0: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
13e0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
13f0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
1400: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
1410: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
1420: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
1430: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
1440: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
1450: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
1460: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1470: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
1480: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
1490: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
14a0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
14b0: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
14c0: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
14d0: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
14e0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
14f0: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
1500: 63 61 72 64 2e 20 20 54 68 65 20 4c 48 53 20 6d  card.  The LHS m
1510: 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e 0a  ust be a column.
1520: 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f 6e 6c 79  ** that may only
1530: 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73 74 72 69   be NULL, a stri
1540: 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42 2c 20 6e  ng, or a BLOB, n
1550: 65 76 65 72 20 61 20 6e 75 6d 62 65 72 2e 20 28  ever a number. (
1560: 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  This means.** th
1570: 61 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  at virtual table
1580: 73 20 63 61 6e 6e 6f 74 20 70 61 72 74 69 63 69  s cannot partici
1590: 70 61 74 65 20 69 6e 20 74 68 65 20 4c 49 4b 45  pate in the LIKE
15a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 29 20   optimization.) 
15b0: 20 54 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   The.** collatin
15c0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
15d0: 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  he column on the
15e0: 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 70 70   LHS must be app
15f0: 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
1600: 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  the operator..*/
1610: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
1620: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
1630: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1640: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1650: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1660: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1670: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1680: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
1690: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
16a0: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
16b0: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
16c0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
16d0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
16e0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
16f0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
1700: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
1710: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
1720: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
1730: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
1740: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
1750: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
1760: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
1770: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
1780: 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b  const u8 *z = 0;
1790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
17a0: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
17b0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
17c0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
17d0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
17e0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
17f0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
1800: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
1810: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
1820: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1830: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
1840: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
1850: 0a 20 20 75 38 20 63 3b 20 20 20 20 20 20 20 20  .  u8 c;        
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1870: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
1880: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
1890: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
18a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18b0: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
18c0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
18d0: 73 20 2a 2f 0a 20 20 75 38 20 77 63 5b 34 5d 3b  s */.  u8 wc[4];
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
1900: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
1910: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1920: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
1930: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1940: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1950: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
1960: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1980: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
1990: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 74 6f  * Result code to
19c0: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66   return */..  if
19d0: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
19e0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
19f0: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 28 63 68  pr, pnoCase, (ch
1a00: 61 72 2a 29 77 63 29 20 29 7b 0a 20 20 20 20 72  ar*)wc) ){.    r
1a10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
1a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
1a30: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
1a40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
1a50: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
1a60: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1a70: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
1a80: 5b 31 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 70 52  [1].pExpr;..  pR
1a90: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
1aa0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
1ab0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
1ac0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
1ad0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
1ae0: 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 28 64  K_VARIABLE && (d
1af0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1b00: 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
1b10: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
1b20: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
1b30: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
1b40: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
1b50: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
1b60: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
1b70: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
1b80: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
1b90: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
1ba0: 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
1bb0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
1bc0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
1bd0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
1be0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
1bf0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
1c00: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
1c10: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
1c20: 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
1c30: 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73  e, iCol);.    as
1c40: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
1c50: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c  ==TK_VARIABLE ||
1c60: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
1c70: 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65  REGISTER );.  }e
1c80: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
1c90: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d  TRING ){.    z =
1ca0: 20 28 75 38 2a 29 70 52 69 67 68 74 2d 3e 75 2e   (u8*)pRight->u.
1cb0: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
1cc0: 28 20 7a 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43  ( z ){..    /* C
1cd0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1ce0: 6f 66 20 70 72 65 66 69 78 20 63 68 61 72 61 63  of prefix charac
1cf0: 74 65 72 73 20 70 72 69 6f 72 20 74 6f 20 74 68  ters prior to th
1d00: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
1d10: 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   */.    cnt = 0;
1d20: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
1d30: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
1d40: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
1d50: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
1d60: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
1d70: 20 20 20 20 69 66 28 20 63 3d 3d 77 63 5b 33 5d      if( c==wc[3]
1d80: 20 26 26 20 7a 5b 63 6e 74 5d 21 3d 30 20 29 20   && z[cnt]!=0 ) 
1d90: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  cnt++;.    }..  
1da0: 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
1db0: 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
1dc0: 65 20 6f 6e 6c 79 20 69 66 20 28 31 29 20 74 68  e only if (1) th
1dd0: 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73 20 6e  e pattern does n
1de0: 6f 74 20 62 65 67 69 6e 0a 20 20 20 20 2a 2a 20  ot begin.    ** 
1df0: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 20  with a wildcard 
1e00: 61 6e 64 20 69 66 20 28 32 29 20 74 68 65 20 6e  and if (2) the n
1e10: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
1e20: 69 78 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ix does not end 
1e30: 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 28  with.    ** an (
1e40: 69 6c 6c 65 67 61 6c 20 30 78 66 66 29 20 63 68  illegal 0xff) ch
1e50: 61 72 61 63 74 65 72 2c 20 6f 72 20 28 33 29 20  aracter, or (3) 
1e60: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73  the pattern does
1e70: 20 6e 6f 74 20 63 6f 6e 73 69 73 74 20 6f 66 0a   not consist of.
1e80: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1e90: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
1ea0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e  . The second con
1eb0: 64 69 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  dition is necess
1ec0: 61 72 79 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68  ary so.    ** th
1ed0: 61 74 20 77 65 20 63 61 6e 20 69 6e 63 72 65 6d  at we can increm
1ee0: 65 6e 74 20 74 68 65 20 70 72 65 66 69 78 20 6b  ent the prefix k
1ef0: 65 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 75 70  ey to find an up
1f00: 70 65 72 20 62 6f 75 6e 64 20 66 6f 72 20 74 68  per bound for th
1f10: 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 73  e.    ** range s
1f20: 65 61 72 63 68 2e 20 54 68 65 20 74 68 69 72 64  earch. The third
1f30: 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1f40: 63 61 6c 6c 65 72 20 61 73 73 75 6d 65 73 20 74  caller assumes t
1f50: 68 61 74 20 74 68 65 20 70 61 74 74 65 72 6e 0a  hat the pattern.
1f60: 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
1f70: 6f 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  of at least one 
1f80: 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20  character after 
1f90: 61 6c 6c 20 65 73 63 61 70 65 73 20 68 61 76 65  all escapes have
1fa0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 6d   been.    ** rem
1fb0: 6f 76 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oved.  */.    if
1fc0: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
1fd0: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 26 26  =(u8)z[cnt-1] &&
1fe0: 20 28 63 6e 74 3e 31 20 7c 7c 20 7a 5b 30 5d 21   (cnt>1 || z[0]!
1ff0: 3d 77 63 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20  =wc[3]) ){.     
2000: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
2010: 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 63 6f 6d  .      /* A "com
2020: 70 6c 65 74 65 22 20 6d 61 74 63 68 20 69 66 20  plete" match if 
2030: 74 68 65 20 70 61 74 74 65 72 6e 20 65 6e 64 73  the pattern ends
2040: 20 77 69 74 68 20 22 2a 22 20 6f 72 20 22 25 22   with "*" or "%"
2050: 20 2a 2f 0a 20 20 20 20 20 20 2a 70 69 73 43 6f   */.      *pisCo
2060: 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30  mplete = c==wc[0
2070: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
2080: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ;..      /* Get 
2090: 74 68 65 20 70 61 74 74 65 72 6e 20 70 72 65 66  the pattern pref
20a0: 69 78 2e 20 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ix.  Remove all 
20b0: 65 73 63 61 70 65 73 20 66 72 6f 6d 20 74 68 65  escapes from the
20c0: 20 70 72 65 66 69 78 2e 20 2a 2f 0a 20 20 20 20   prefix. */.    
20d0: 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69    pPrefix = sqli
20e0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53  te3Expr(db, TK_S
20f0: 54 52 49 4e 47 2c 20 28 63 68 61 72 2a 29 7a 29  TRING, (char*)z)
2100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
2110: 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fix ){.        i
2120: 6e 74 20 69 46 72 6f 6d 2c 20 69 54 6f 3b 0a 20  nt iFrom, iTo;. 
2130: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65         char *zNe
2140: 77 20 3d 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  w = pPrefix->u.z
2150: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a  Token;.        z
2160: 4e 65 77 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20  New[cnt] = 0;.  
2170: 20 20 20 20 20 20 66 6f 72 28 69 46 72 6f 6d 3d        for(iFrom=
2180: 69 54 6f 3d 30 3b 20 69 46 72 6f 6d 3c 63 6e 74  iTo=0; iFrom<cnt
2190: 3b 20 69 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  ; iFrom++){.    
21a0: 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 69        if( zNew[i
21b0: 46 72 6f 6d 5d 3d 3d 77 63 5b 33 5d 20 29 20 69  From]==wc[3] ) i
21c0: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
21d0: 20 20 7a 4e 65 77 5b 69 54 6f 2b 2b 5d 20 3d 20    zNew[iTo++] = 
21e0: 7a 4e 65 77 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20  zNew[iFrom];.   
21f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
2200: 4e 65 77 5b 69 54 6f 5d 20 3d 20 30 3b 0a 20 20  New[iTo] = 0;.  
2210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
2220: 6f 3e 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  o>0 );..        
2230: 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  /* If the LHS is
2240: 20 6e 6f 74 20 61 6e 20 6f 72 64 69 6e 61 72 79   not an ordinary
2250: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58   column with TEX
2260: 54 20 61 66 66 69 6e 69 74 79 2c 20 74 68 65 6e  T affinity, then
2270: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2280: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 62  pattern prefix b
2290: 6f 75 6e 64 61 72 69 65 73 20 28 62 6f 74 68 20  oundaries (both 
22a0: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
22b0: 64 20 62 6f 75 6e 64 61 72 69 65 73 29 20 6d 75  d boundaries) mu
22c0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
22d0: 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75  t look like a nu
22e0: 6d 62 65 72 2e 20 20 4f 74 68 65 72 77 69 73 65  mber.  Otherwise
22f0: 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d 69 67   the pattern mig
2300: 68 74 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ht be treated as
2310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 6e 75  .        ** a nu
2320: 6d 62 65 72 2c 20 77 68 69 63 68 20 77 69 6c 6c  mber, which will
2330: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
2340: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
2350: 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
2360: 20 20 20 20 20 20 2a 2a 20 47 65 74 74 69 6e 67        ** Getting
2370: 20 74 68 69 73 20 72 69 67 68 74 20 68 61 73 20   this right has 
2380: 62 65 65 6e 20 61 20 70 65 72 73 69 73 74 65 6e  been a persisten
2390: 74 20 73 6f 75 72 63 65 20 6f 66 20 62 75 67 73  t source of bugs
23a0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
23b0: 2a 2a 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  ** LIKE optimiza
23c0: 74 69 6f 6e 2e 20 20 53 65 65 2c 20 66 6f 72 20  tion.  See, for 
23d0: 65 78 61 6d 70 6c 65 3a 0a 20 20 20 20 20 20 20  example:.       
23e0: 20 2a 2a 20 20 20 20 32 30 31 38 2d 30 39 2d 31   **    2018-09-1
23f0: 30 20 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65  0 https://sqlite
2400: 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 63 39  .org/src/info/c9
2410: 34 33 36 39 63 61 65 39 62 35 36 31 62 31 0a 20  4369cae9b561b1. 
2420: 20 20 20 20 20 20 20 2a 2a 20 20 20 20 32 30 31         **    201
2430: 39 2d 30 35 2d 30 32 20 68 74 74 70 73 3a 2f 2f  9-05-02 https://
2440: 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
2450: 6e 66 6f 2f 62 30 34 33 61 35 34 63 33 64 65 35  nfo/b043a54c3de5
2460: 34 62 32 38 0a 20 20 20 20 20 20 20 20 2a 2a 20  4b28.        ** 
2470: 20 20 20 32 30 31 39 2d 30 36 2d 31 30 20 68 74     2019-06-10 ht
2480: 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  tps://sqlite.org
2490: 2f 73 72 63 2f 69 6e 66 6f 2f 66 64 37 36 33 31  /src/info/fd7631
24a0: 30 61 35 65 38 34 33 65 30 37 0a 20 20 20 20 20  0a5e843e07.     
24b0: 20 20 20 2a 2a 20 20 20 20 32 30 31 39 2d 30 36     **    2019-06
24c0: 2d 31 34 20 68 74 74 70 73 3a 2f 2f 73 71 6c 69  -14 https://sqli
24d0: 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
24e0: 63 65 38 37 31 37 66 30 38 38 35 61 66 39 37 35  ce8717f0885af975
24f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 32  .        **    2
2500: 30 31 39 2d 30 39 2d 30 33 20 68 74 74 70 73 3a  019-09-03 https:
2510: 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  //sqlite.org/src
2520: 2f 69 6e 66 6f 2f 30 66 30 34 32 38 30 39 36 66  /info/0f0428096f
2530: 31 37 32 35 32 61 0a 20 20 20 20 20 20 20 20 2a  17252a.        *
2540: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  /.        if( pL
2550: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
2560: 4d 4e 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  MN .         || 
2570: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
2580: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
2590: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
25a0: 20 20 20 20 20 20 7c 7c 20 49 73 56 69 72 74 75        || IsVirtu
25b0: 61 6c 28 70 4c 65 66 74 2d 3e 79 2e 70 54 61 62  al(pLeft->y.pTab
25c0: 29 20 20 2f 2a 20 56 61 6c 75 65 20 6d 69 67 68  )  /* Value migh
25d0: 74 20 62 65 20 6e 75 6d 65 72 69 63 20 2a 2f 0a  t be numeric */.
25e0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25f0: 20 20 20 20 20 69 6e 74 20 69 73 4e 75 6d 3b 0a       int isNum;.
2600: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
2610: 20 72 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   rDummy;.       
2620: 20 20 20 69 73 4e 75 6d 20 3d 20 73 71 6c 69 74     isNum = sqlit
2630: 65 33 41 74 6f 46 28 7a 4e 65 77 2c 20 26 72 44  e3AtoF(zNew, &rD
2640: 75 6d 6d 79 2c 20 69 54 6f 2c 20 53 51 4c 49 54  ummy, iTo, SQLIT
2650: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20  E_UTF8);.       
2660: 20 20 20 69 66 28 20 69 73 4e 75 6d 3c 3d 30 20     if( isNum<=0 
2670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2680: 66 28 20 69 54 6f 3d 3d 31 20 26 26 20 7a 4e 65  f( iTo==1 && zNe
2690: 77 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  w[0]=='-' ){.   
26a0: 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 75 6d             isNum
26b0: 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
26c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26d0: 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 69 54 6f          zNew[iTo
26e0: 2d 31 5d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  -1]++;.         
26f0: 20 20 20 20 20 69 73 4e 75 6d 20 3d 20 73 71 6c       isNum = sql
2700: 69 74 65 33 41 74 6f 46 28 7a 4e 65 77 2c 20 26  ite3AtoF(zNew, &
2710: 72 44 75 6d 6d 79 2c 20 69 54 6f 2c 20 53 51 4c  rDummy, iTo, SQL
2720: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
2730: 20 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 69 54           zNew[iT
2740: 6f 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 20 20  o-1]--;.        
2750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2760: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2770: 69 73 4e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20  isNum>0 ){.     
2780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2790: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 72  prDelete(db, pPr
27a0: 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20  efix);.         
27b0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
27c0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ree(pVal);.     
27d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
27e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2800: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
2810: 20 70 50 72 65 66 69 78 3b 0a 0a 20 20 20 20 20   pPrefix;..     
2820: 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 70   /* If the RHS p
2830: 61 74 74 65 72 6e 20 69 73 20 61 20 62 6f 75 6e  attern is a boun
2840: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 6d 61 6b  d parameter, mak
2850: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
2860: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65  o.      ** repre
2870: 70 61 72 65 20 74 68 65 20 73 74 61 74 65 6d 65  pare the stateme
2880: 6e 74 20 77 68 65 6e 20 74 68 61 74 20 70 61 72  nt when that par
2890: 61 6d 65 74 65 72 20 69 73 20 72 65 62 6f 75 6e  ameter is reboun
28a0: 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f  d */.      if( o
28b0: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
28c0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
28d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28e0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
28f0: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
2900: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
2910: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
2920: 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26  ( *pisComplete &
2930: 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  & pRight->u.zTok
2940: 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  en[1] ){.       
2950: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73     /* If the rhs
2960: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70   of the LIKE exp
2970: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72  ression is a var
2980: 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63  iable, and the c
2990: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
29a0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65   ** value of the
29b0: 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20   variable means 
29c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
29d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c   to invoke the L
29e0: 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  IKE.          **
29f0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
2a00: 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77  no OP_Variable w
2a10: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
2a20: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
2a30: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
2a40: 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66  auses problems f
2a50: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
2a60: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
2a70: 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  me().          *
2a80: 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 20 61  * API. To work a
2a90: 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20  round them, add 
2aa0: 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61  a dummy OP_Varia
2ab0: 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ble here..      
2ac0: 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
2ad0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
2ae0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2af0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
2b00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
2b10: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52  arget(pParse, pR
2b20: 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  ight, r1);.     
2b30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b40: 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69  ChangeP3(v, sqli
2b50: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2b60: 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20  dr(v)-1, 0);.   
2b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2b80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2b90: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
2ba0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
2bc0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2bd0: 20 72 63 20 3d 20 28 7a 21 3d 30 29 3b 0a 20 20   rc = (z!=0);.  
2be0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
2bf0: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
2c00: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2c10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
2c20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
2c30: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
2c40: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2c50: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
2c60: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2c70: 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2c80: 69 73 20 61 20 66 6f 72 6d 20 74 68 61 74 20 6e  is a form that n
2c90: 65 65 64 73 20 74 6f 20 62 65 20 70 61 73 73 65  eeds to be passe
2ca0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 78 42 65 73  d.** to the xBes
2cb0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66  tIndex method of
2cc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
2cd0: 20 20 46 6f 72 6d 73 20 6f 66 20 69 6e 74 65 72    Forms of inter
2ce0: 65 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  est include:.**.
2cf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  **          Expr
2d00: 65 73 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ession          
2d10: 20 20 20 20 20 20 20 20 20 56 69 72 74 75 61 6c           Virtual
2d20: 20 54 61 62 6c 65 20 4f 70 65 72 61 74 6f 72 0a   Table Operator.
2d30: 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ---      -------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
2d80: 20 20 20 31 2e 20 20 63 6f 6c 75 6d 6e 20 4d 41     1.  column MA
2d90: 54 43 48 20 65 78 70 72 20 20 20 20 20 20 20 20  TCH expr        
2da0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58      SQLITE_INDEX
2db0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
2dc0: 48 0a 2a 2a 20 20 20 20 20 20 32 2e 20 20 63 6f  H.**      2.  co
2dd0: 6c 75 6d 6e 20 47 4c 4f 42 20 65 78 70 72 20 20  lumn GLOB expr  
2de0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2df0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
2e00: 4e 54 5f 47 4c 4f 42 0a 2a 2a 20 20 20 20 20 20  NT_GLOB.**      
2e10: 33 2e 20 20 63 6f 6c 75 6d 6e 20 4c 49 4b 45 20  3.  column LIKE 
2e20: 65 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  expr            
2e30: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
2e40: 4e 53 54 52 41 49 4e 54 5f 4c 49 4b 45 0a 2a 2a  NSTRAINT_LIKE.**
2e50: 20 20 20 20 20 20 34 2e 20 20 63 6f 6c 75 6d 6e        4.  column
2e60: 20 52 45 47 45 58 50 20 65 78 70 72 20 20 20 20   REGEXP expr    
2e70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
2e80: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  DEX_CONSTRAINT_R
2e90: 45 47 45 58 50 0a 2a 2a 20 20 20 20 20 20 35 2e  EGEXP.**      5.
2ea0: 20 20 63 6f 6c 75 6d 6e 20 21 3d 20 65 78 70 72    column != expr
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2ec0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
2ed0: 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a 20 20 20 20  TRAINT_NE.**    
2ee0: 20 20 36 2e 20 20 65 78 70 72 20 21 3d 20 63 6f    6.  expr != co
2ef0: 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20  lumn            
2f00: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f     SQLITE_INDEX_
2f10: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a  CONSTRAINT_NE.**
2f20: 20 20 20 20 20 20 37 2e 20 20 63 6f 6c 75 6d 6e        7.  column
2f30: 20 49 53 20 4e 4f 54 20 65 78 70 72 20 20 20 20   IS NOT expr    
2f40: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
2f50: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
2f60: 53 4e 4f 54 0a 2a 2a 20 20 20 20 20 20 38 2e 20  SNOT.**      8. 
2f70: 20 65 78 70 72 20 49 53 20 4e 4f 54 20 63 6f 6c   expr IS NOT col
2f80: 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 53 51  umn           SQ
2f90: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
2fa0: 52 41 49 4e 54 5f 49 53 4e 4f 54 0a 2a 2a 20 20  RAINT_ISNOT.**  
2fb0: 20 20 20 20 39 2e 20 20 63 6f 6c 75 6d 6e 20 49      9.  column I
2fc0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20  S NOT NULL      
2fd0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45       SQLITE_INDE
2fe0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e  X_CONSTRAINT_ISN
2ff0: 4f 54 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 49 6e 20  OTNULL.**.** In 
3000: 65 76 65 72 79 20 63 61 73 65 2c 20 22 63 6f 6c  every case, "col
3010: 75 6d 6e 22 20 6d 75 73 74 20 62 65 20 61 20 63  umn" must be a c
3020: 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75  olumn of a virtu
3030: 61 6c 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  al table.  If th
3040: 65 72 65 0a 2a 2a 20 69 73 20 61 20 6d 61 74 63  ere.** is a matc
3050: 68 2c 20 73 65 74 20 2a 70 70 4c 65 66 74 20 74  h, set *ppLeft t
3060: 6f 20 74 68 65 20 22 63 6f 6c 75 6d 6e 22 20 65  o the "column" e
3070: 78 70 72 65 73 73 69 6f 6e 2c 20 73 65 74 20 2a  xpression, set *
3080: 70 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 0a  ppRight to the .
3090: 2a 2a 20 22 65 78 70 72 22 20 65 78 70 72 65 73  ** "expr" expres
30a0: 73 69 6f 6e 20 28 65 76 65 6e 20 74 68 6f 75 67  sion (even thoug
30b0: 68 20 69 6e 20 66 6f 72 6d 73 20 28 36 29 20 61  h in forms (6) a
30c0: 6e 64 20 28 38 29 20 74 68 65 20 63 6f 6c 75 6d  nd (8) the colum
30d0: 6e 20 69 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  n is on the.** r
30e0: 69 67 68 74 20 61 6e 64 20 74 68 65 20 65 78 70  ight and the exp
30f0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 6e 20 74 68  ression is on th
3100: 65 20 6c 65 66 74 29 2e 20 20 41 6c 73 6f 20 73  e left).  Also s
3110: 65 74 20 2a 70 65 4f 70 32 20 74 6f 20 74 68 65  et *peOp2 to the
3120: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
3130: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 70  virtual table op
3140: 65 72 61 74 6f 72 2e 20 20 54 68 65 20 72 65 74  erator.  The ret
3150: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 20 6f  urn value is 1 o
3160: 72 20 32 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  r 2 if there.** 
3170: 69 73 20 61 20 6d 61 74 63 68 2e 20 20 54 68 65  is a match.  The
3180: 20 75 73 75 61 6c 20 72 65 74 75 72 6e 20 69 73   usual return is
3190: 20 31 2c 20 62 75 74 20 69 66 20 74 68 65 20 52   1, but if the R
31a0: 48 53 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  HS is also a col
31b0: 75 6d 6e 0a 2a 2a 20 6f 66 20 76 69 72 74 75 61  umn.** of virtua
31c0: 6c 20 74 61 62 6c 65 20 69 6e 20 66 6f 72 6d 73  l table in forms
31d0: 20 28 35 29 20 6f 72 20 28 37 29 20 74 68 65 6e   (5) or (7) then
31e0: 20 72 65 74 75 72 6e 20 32 2e 0a 2a 2a 0a 2a 2a   return 2..**.**
31f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
3200: 6f 6e 20 6d 61 74 63 68 65 73 20 6e 6f 6e 65 20  on matches none 
3210: 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e 73 20  of the patterns 
3220: 61 62 6f 76 65 2c 20 72 65 74 75 72 6e 20 30 2e  above, return 0.
3230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3240: 73 41 75 78 69 6c 69 61 72 79 56 74 61 62 4f 70  sAuxiliaryVtabOp
3250: 65 72 61 74 6f 72 28 0a 20 20 73 71 6c 69 74 65  erator(.  sqlite
3260: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3280: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3290: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
32c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 75  xpression */.  u
32d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 65  nsigned char *pe
32e0: 4f 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Op2,           /
32f0: 2a 20 4f 55 54 3a 20 30 20 66 6f 72 20 4d 41 54  * OUT: 0 for MAT
3300: 43 48 2c 20 6f 72 20 65 6c 73 65 20 61 6e 20 6f  CH, or else an o
3310: 70 32 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78  p2 value */.  Ex
3320: 70 72 20 2a 2a 70 70 4c 65 66 74 2c 20 20 20 20  pr **ppLeft,    
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3340: 20 43 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   Column expressi
3350: 6f 6e 20 74 6f 20 6c 65 66 74 20 6f 66 20 4d 41  on to left of MA
3360: 54 43 48 2f 6f 70 32 20 2a 2f 0a 20 20 45 78 70  TCH/op2 */.  Exp
3370: 72 20 2a 2a 70 70 52 69 67 68 74 20 20 20 20 20  r **ppRight     
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3390: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c 65  Expression to le
33a0: 66 74 20 6f 66 20 4d 41 54 43 48 2f 6f 70 32 20  ft of MATCH/op2 
33b0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
33c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
33d0: 4f 4e 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  ON ){.    static
33e0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4f 70   const struct Op
33f0: 32 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  2 {.      const 
3400: 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 20  char *zOp;.     
3410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
3420: 4f 70 32 3b 0a 20 20 20 20 7d 20 61 4f 70 5b 5d  Op2;.    } aOp[]
3430: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6d 61   = {.      { "ma
3440: 74 63 68 22 2c 20 20 53 51 4c 49 54 45 5f 49 4e  tch",  SQLITE_IN
3450: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
3460: 41 54 43 48 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ATCH },.      { 
3470: 22 67 6c 6f 62 22 2c 20 20 20 53 51 4c 49 54 45  "glob",   SQLITE
3480: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
3490: 54 5f 47 4c 4f 42 20 7d 2c 0a 20 20 20 20 20 20  T_GLOB },.      
34a0: 7b 20 22 6c 69 6b 65 22 2c 20 20 20 53 51 4c 49  { "like",   SQLI
34b0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
34c0: 49 4e 54 5f 4c 49 4b 45 20 7d 2c 0a 20 20 20 20  INT_LIKE },.    
34d0: 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 53 51    { "regexp", SQ
34e0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
34f0: 52 41 49 4e 54 5f 52 45 47 45 58 50 20 7d 0a 20  RAINT_REGEXP }. 
3500: 20 20 20 7d 3b 0a 20 20 20 20 45 78 70 72 4c 69     };.    ExprLi
3510: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 45  st *pList;.    E
3520: 78 70 72 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  xpr *pCol;      
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3540: 2a 20 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  * Column referen
3550: 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ce */.    int i;
3560: 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 45  ..    pList = pE
3570: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
3580: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
3590: 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  | pList->nExpr!=
35a0: 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
35b0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
35c0: 2f 2a 20 42 75 69 6c 74 2d 69 6e 20 6f 70 65 72  /* Built-in oper
35d0: 61 74 6f 72 73 20 4d 41 54 43 48 2c 20 47 4c 4f  ators MATCH, GLO
35e0: 42 2c 20 4c 49 4b 45 2c 20 61 6e 64 20 52 45 47  B, LIKE, and REG
35f0: 45 58 50 20 61 74 74 61 63 68 20 74 6f 20 61 0a  EXP attach to a.
3600: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
3610: 61 62 6c 65 20 6f 6e 20 74 68 65 69 72 20 73 65  able on their se
3620: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 77  cond argument, w
3630: 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
3640: 20 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c   as.    ** the l
3650: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 70  eft-hand side op
3660: 65 72 61 6e 64 20 69 6e 20 74 68 65 69 72 20 69  erand in their i
3670: 6e 2d 66 69 78 20 66 6f 72 6d 2e 0a 20 20 20 20  n-fix form..    
3680: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
3690: 76 74 61 62 5f 63 6f 6c 75 6d 6e 20 4d 41 54 43  vtab_column MATC
36a0: 48 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  H expression.   
36b0: 20 2a 2a 20 20 20 20 20 20 20 4d 41 54 43 48 28   **       MATCH(
36c0: 65 78 70 72 65 73 73 69 6f 6e 2c 76 74 61 62 5f  expression,vtab_
36d0: 63 6f 6c 75 6d 6e 29 0a 20 20 20 20 2a 2f 0a 20  column).    */. 
36e0: 20 20 20 70 43 6f 6c 20 3d 20 70 4c 69 73 74 2d     pCol = pList-
36f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
3700: 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 3d 3d 54   if( pCol->op==T
3710: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
3720: 72 74 75 61 6c 28 70 43 6f 6c 2d 3e 79 2e 70 54  rtual(pCol->y.pT
3730: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ab) ){.      for
3740: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
3750: 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  e(aOp); i++){.  
3760: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3770: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
3780: 75 2e 7a 54 6f 6b 65 6e 2c 20 61 4f 70 5b 69 5d  u.zToken, aOp[i]
3790: 2e 7a 4f 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  .zOp)==0 ){.    
37a0: 20 20 20 20 20 20 2a 70 65 4f 70 32 20 3d 20 61        *peOp2 = a
37b0: 4f 70 5b 69 5d 2e 65 4f 70 32 3b 0a 20 20 20 20  Op[i].eOp2;.    
37c0: 20 20 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d        *ppRight =
37d0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
37e0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  pr;.          *p
37f0: 70 4c 65 66 74 20 3d 20 70 43 6f 6c 3b 0a 20 20  pLeft = pCol;.  
3800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3810: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3820: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
3830: 2a 20 57 65 20 63 61 6e 20 61 6c 73 6f 20 6d 61  * We can also ma
3840: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
3850: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
3860: 6f 76 65 72 6c 6f 61 64 65 64 0a 20 20 20 20 2a  overloaded.    *
3870: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 72  * functions wher
3880: 65 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20  e xFindFunction 
3890: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20  returns a value 
38a0: 6f 66 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  of at least.    
38b0: 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  ** SQLITE_INDEX_
38c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
38d0: 49 4f 4e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ION..    **.    
38e0: 2a 2a 20 20 20 20 20 20 4f 56 45 52 4c 4f 41 44  **      OVERLOAD
38f0: 45 44 28 76 74 61 62 5f 63 6f 6c 75 6d 6e 2c 65  ED(vtab_column,e
3900: 78 70 72 65 73 73 69 6f 6e 29 0a 20 20 20 20 2a  xpression).    *
3910: 2a 0a 20 20 20 20 2a 2a 20 48 69 73 74 6f 72 69  *.    ** Histori
3920: 63 61 6c 6c 79 2c 20 78 46 69 6e 64 46 75 6e 63  cally, xFindFunc
3930: 74 69 6f 6e 20 65 78 70 65 63 74 65 64 20 74 6f  tion expected to
3940: 20 73 65 65 20 6c 6f 77 65 72 2d 63 61 73 65 20   see lower-case 
3950: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  function.    ** 
3960: 6e 61 6d 65 73 2e 20 20 42 75 74 20 66 6f 72 20  names.  But for 
3970: 74 68 69 73 20 75 73 65 20 63 61 73 65 2c 20 78  this use case, x
3980: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 69 73 20  FindFunction is 
3990: 65 78 70 65 63 74 65 64 20 74 6f 20 64 65 61 6c  expected to deal
39a0: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 66 75 6e  .    ** with fun
39b0: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 69 6e 20 61  ction names in a
39c0: 6e 20 61 72 62 69 74 72 61 72 79 20 63 61 73 65  n arbitrary case
39d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 6f  ..    */.    pCo
39e0: 6c 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  l = pList->a[0].
39f0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
3a00: 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Col->op==TK_COLU
3a10: 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
3a20: 70 43 6f 6c 2d 3e 79 2e 70 54 61 62 29 20 29 7b  pCol->y.pTab) ){
3a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
3a40: 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 20 20  tab *pVtab;.    
3a50: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
3a60: 20 2a 70 4d 6f 64 3b 0a 20 20 20 20 20 20 76 6f   *pMod;.      vo
3a70: 69 64 20 28 2a 78 4e 6f 74 55 73 65 64 29 28 73  id (*xNotUsed)(s
3a80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
3a90: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
3aa0: 65 2a 2a 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  e**);.      void
3ab0: 20 2a 70 4e 6f 74 55 73 65 64 3b 0a 20 20 20 20   *pNotUsed;.    
3ac0: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
3ad0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
3ae0: 43 6f 6c 2d 3e 79 2e 70 54 61 62 29 2d 3e 70 56  Col->y.pTab)->pV
3af0: 74 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tab;.      asser
3b00: 74 28 20 70 56 74 61 62 21 3d 30 20 29 3b 0a 20  t( pVtab!=0 );. 
3b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 74       assert( pVt
3b20: 61 62 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30 20 29  ab->pModule!=0 )
3b30: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 28  ;.      pMod = (
3b40: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
3b50: 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  )pVtab->pModule;
3b60: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  .      if( pMod-
3b70: 3e 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 21 3d  >xFindFunction!=
3b80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
3b90: 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e 63   pMod->xFindFunc
3ba0: 74 69 6f 6e 28 70 56 74 61 62 2c 32 2c 20 70 45  tion(pVtab,2, pE
3bb0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  xpr->u.zToken, &
3bc0: 78 4e 6f 74 55 73 65 64 2c 20 26 70 4e 6f 74 55  xNotUsed, &pNotU
3bd0: 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sed);.        if
3be0: 28 20 69 3e 3d 53 51 4c 49 54 45 5f 49 4e 44 45  ( i>=SQLITE_INDE
3bf0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  X_CONSTRAINT_FUN
3c00: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20  CTION ){.       
3c10: 20 20 20 2a 70 65 4f 70 32 20 3d 20 69 3b 0a 20     *peOp2 = i;. 
3c20: 20 20 20 20 20 20 20 20 20 2a 70 70 52 69 67 68           *ppRigh
3c30: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  t = pList->a[1].
3c40: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
3c50: 20 2a 70 70 4c 65 66 74 20 3d 20 70 43 6f 6c 3b   *ppLeft = pCol;
3c60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3c70: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3c80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3c90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
3ca0: 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78  op==TK_NE || pEx
3cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
3cc0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
3cd0: 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 7b 0a 20 20 20  K_NOTNULL ){.   
3ce0: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
3cf0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
3d00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
3d10: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
3d20: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
3d30: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
3d40: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
3d50: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
3d60: 3e 79 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  >y.pTab) ){.    
3d70: 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20    res++;.    }. 
3d80: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
3d90: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
3da0: 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
3db0: 75 61 6c 28 70 52 69 67 68 74 2d 3e 79 2e 70 54  ual(pRight->y.pT
3dc0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ab) ){.      res
3dd0: 2b 2b 3b 0a 20 20 20 20 20 20 53 57 41 50 28 45  ++;.      SWAP(E
3de0: 78 70 72 2a 2c 20 70 4c 65 66 74 2c 20 70 52 69  xpr*, pLeft, pRi
3df0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
3e00: 2a 70 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b  *ppLeft = pLeft;
3e10: 0a 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d 20  .    *ppRight = 
3e20: 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
3e30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
3e40: 20 29 20 2a 70 65 4f 70 32 20 3d 20 53 51 4c 49   ) *peOp2 = SQLI
3e50: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
3e60: 49 4e 54 5f 4e 45 3b 0a 20 20 20 20 69 66 28 20  INT_NE;.    if( 
3e70: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
3e80: 4e 4f 54 20 29 20 2a 70 65 4f 70 32 20 3d 20 53  NOT ) *peOp2 = S
3e90: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
3ea0: 54 52 41 49 4e 54 5f 49 53 4e 4f 54 3b 0a 20 20  TRAINT_ISNOT;.  
3eb0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
3ec0: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 20 2a 70  =TK_NOTNULL ) *p
3ed0: 65 4f 70 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e  eOp2 = SQLITE_IN
3ee0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
3ef0: 53 4e 4f 54 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  SNOTNULL;.    re
3f00: 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 20 20  turn res;.  }.  
3f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
3f20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
3f30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
3f40: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
3f50: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
3f60: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
3f70: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
3f80: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
3f90: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
3fa0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
3fb0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
3fc0: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
3fd0: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
3fe0: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
3ff0: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
4000: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
4010: 69 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a  if( pDerived ){.
4020: 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c      pDerived->fl
4030: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
4040: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
4050: 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d  n;.    pDerived-
4060: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
4070: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
4080: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d  JoinTable;.  }.}
4090: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 65 72  ../*.** Mark ter
40a0: 6d 20 69 43 68 69 6c 64 20 61 73 20 62 65 69 6e  m iChild as bein
40b0: 67 20 61 20 63 68 69 6c 64 20 6f 66 20 74 65 72  g a child of ter
40c0: 6d 20 69 50 61 72 65 6e 74 0a 2a 2f 0a 73 74 61  m iParent.*/.sta
40d0: 74 69 63 20 76 6f 69 64 20 6d 61 72 6b 54 65 72  tic void markTer
40e0: 6d 41 73 43 68 69 6c 64 28 57 68 65 72 65 43 6c  mAsChild(WhereCl
40f0: 61 75 73 65 20 2a 70 57 43 2c 20 69 6e 74 20 69  ause *pWC, int i
4100: 43 68 69 6c 64 2c 20 69 6e 74 20 69 50 61 72 65  Child, int iPare
4110: 6e 74 29 7b 0a 20 20 70 57 43 2d 3e 61 5b 69 43  nt){.  pWC->a[iC
4120: 68 69 6c 64 5d 2e 69 50 61 72 65 6e 74 20 3d 20  hild].iParent = 
4130: 69 50 61 72 65 6e 74 3b 0a 20 20 70 57 43 2d 3e  iParent;.  pWC->
4140: 61 5b 69 43 68 69 6c 64 5d 2e 74 72 75 74 68 50  a[iChild].truthP
4150: 72 6f 62 20 3d 20 70 57 43 2d 3e 61 5b 69 50 61  rob = pWC->a[iPa
4160: 72 65 6e 74 5d 2e 74 72 75 74 68 50 72 6f 62 3b  rent].truthProb;
4170: 0a 20 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  .  pWC->a[iParen
4180: 74 5d 2e 6e 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a  t].nChild++;.}..
4190: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
41a0: 20 4e 2d 74 68 20 41 4e 44 2d 63 6f 6e 6e 65 63   N-th AND-connec
41b0: 74 65 64 20 73 75 62 74 65 72 6d 20 6f 66 20 70  ted subterm of p
41c0: 54 65 72 6d 2e 20 20 4f 72 20 69 66 20 70 54 65  Term.  Or if pTe
41d0: 72 6d 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63  rm is not.** a c
41e0: 6f 6e 6a 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  onjunction, then
41f0: 20 72 65 74 75 72 6e 20 6a 75 73 74 20 70 54 65   return just pTe
4200: 72 6d 20 77 68 65 6e 20 4e 3d 3d 30 2e 20 20 49  rm when N==0.  I
4210: 66 20 4e 20 69 73 20 65 78 63 65 65 64 73 0a 2a  f N is exceeds.*
4220: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
4230: 61 76 61 69 6c 61 62 6c 65 20 73 75 62 74 65 72  available subter
4240: 6d 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ms, return NULL.
4250: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
4260: 54 65 72 6d 20 2a 77 68 65 72 65 4e 74 68 53 75  Term *whereNthSu
4270: 62 74 65 72 6d 28 57 68 65 72 65 54 65 72 6d 20  bterm(WhereTerm 
4280: 2a 70 54 65 72 6d 2c 20 69 6e 74 20 4e 29 7b 0a  *pTerm, int N){.
4290: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
42a0: 65 72 61 74 6f 72 21 3d 57 4f 5f 41 4e 44 20 29  erator!=WO_AND )
42b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 3d 3d  {.    return N==
42c0: 30 20 3f 20 70 54 65 72 6d 20 3a 20 30 3b 0a 20  0 ? pTerm : 0;. 
42d0: 20 7d 0a 20 20 69 66 28 20 4e 3c 70 54 65 72 6d   }.  if( N<pTerm
42e0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
42f0: 2e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 72 65  .nTerm ){.    re
4300: 74 75 72 6e 20 26 70 54 65 72 6d 2d 3e 75 2e 70  turn &pTerm->u.p
4310: 41 6e 64 49 6e 66 6f 2d 3e 77 63 2e 61 5b 4e 5d  AndInfo->wc.a[N]
4320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 74 65  ;.}../*.** Subte
4340: 72 6d 73 20 70 4f 6e 65 20 61 6e 64 20 70 54 77  rms pOne and pTw
4350: 6f 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  o are contained 
4360: 77 69 74 68 69 6e 20 57 48 45 52 45 20 63 6c 61  within WHERE cla
4370: 75 73 65 20 70 57 43 2e 20 20 54 68 65 0a 2a 2a  use pWC.  The.**
4380: 20 74 77 6f 20 73 75 62 74 65 72 6d 73 20 61 72   two subterms ar
4390: 65 20 69 6e 20 64 69 73 6a 75 6e 63 74 69 6f 6e  e in disjunction
43a0: 20 2d 20 74 68 65 79 20 61 72 65 20 4f 52 2d 65   - they are OR-e
43b0: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
43c0: 2a 20 49 66 20 74 68 65 73 65 20 74 77 6f 20 74  * If these two t
43d0: 65 72 6d 73 20 61 72 65 20 62 6f 74 68 20 6f 66  erms are both of
43e0: 20 74 68 65 20 66 6f 72 6d 3a 20 20 22 41 20 6f   the form:  "A o
43f0: 70 20 42 22 20 77 69 74 68 20 74 68 65 20 73 61  p B" with the sa
4400: 6d 65 0a 2a 2a 20 41 20 61 6e 64 20 42 20 76 61  me.** A and B va
4410: 6c 75 65 73 20 62 75 74 20 64 69 66 66 65 72 65  lues but differe
4420: 6e 74 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64  nt operators and
4430: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   if the operator
4440: 73 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 61 74 69  s are.** compati
4450: 62 6c 65 20 28 69 66 20 6f 6e 65 20 69 73 20 3d  ble (if one is =
4460: 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
4470: 73 20 3c 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  s <, for example
4480: 29 20 74 68 65 6e 0a 2a 2a 20 61 64 64 20 61 20  ) then.** add a 
4490: 6e 65 77 20 76 69 72 74 75 61 6c 20 41 4e 44 20  new virtual AND 
44a0: 74 65 72 6d 20 74 6f 20 70 57 43 20 74 68 61 74  term to pWC that
44b0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
44c0: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  ion of the.** tw
44d0: 6f 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 65 78  o..**.** Some ex
44e0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
44f0: 20 78 3c 79 20 4f 52 20 78 3d 79 20 20 20 20 2d   x<y OR x=y    -
4500: 2d 3e 20 20 20 20 20 78 3c 3d 79 0a 2a 2a 20 20  ->     x<=y.**  
4510: 20 20 78 3d 79 20 4f 52 20 78 3d 79 20 20 20 20    x=y OR x=y    
4520: 2d 2d 3e 20 20 20 20 20 78 3d 79 0a 2a 2a 20 20  -->     x=y.**  
4530: 20 20 78 3c 3d 79 20 4f 52 20 78 3c 79 20 20 20    x<=y OR x<y   
4540: 2d 2d 3e 20 20 20 20 20 78 3c 3d 79 0a 2a 2a 0a  -->     x<=y.**.
4550: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
4560: 20 69 73 20 4e 4f 54 20 67 65 6e 65 72 61 74 65   is NOT generate
4570: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20  d:.**.**    x<y 
4580: 4f 52 20 78 3e 79 20 20 20 20 2d 2d 3e 20 20 20  OR x>y    -->   
4590: 20 20 78 21 3d 79 20 20 20 20 20 0a 2a 2f 0a 73    x!=y     .*/.s
45a0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
45b0: 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73  CombineDisjuncts
45c0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
45d0: 63 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  c,         /* th
45e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
45f0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
4600: 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
4610: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
4620: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4630: 65 54 65 72 6d 20 2a 70 4f 6e 65 2c 20 20 20 20  eTerm *pOne,    
4640: 20 20 20 2f 2a 20 46 69 72 73 74 20 64 69 73 6a     /* First disj
4650: 75 6e 63 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  unct */.  WhereT
4660: 65 72 6d 20 2a 70 54 77 6f 20 20 20 20 20 20 20  erm *pTwo       
4670: 20 2f 2a 20 53 65 63 6f 6e 64 20 64 69 73 6a 75   /* Second disju
4680: 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  nct */.){.  u16 
4690: 65 4f 70 20 3d 20 70 4f 6e 65 2d 3e 65 4f 70 65  eOp = pOne->eOpe
46a0: 72 61 74 6f 72 20 7c 20 70 54 77 6f 2d 3e 65 4f  rator | pTwo->eO
46b0: 70 65 72 61 74 6f 72 3b 0a 20 20 73 71 6c 69 74  perator;.  sqlit
46c0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
46d0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
46e0: 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61  nnection (for ma
46f0: 6c 6c 6f 63 29 20 2a 2f 0a 20 20 45 78 70 72 20  lloc) */.  Expr 
4700: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
4710: 20 20 2f 2a 20 4e 65 77 20 76 69 72 74 75 61 6c    /* New virtual
4720: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
4730: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4740: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
4750: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 62  tor for the comb
4760: 69 6e 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  ined expression 
4770: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  */.  int idxNew;
4780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4790: 6e 64 65 78 20 69 6e 20 70 57 43 20 6f 66 20 74  ndex in pWC of t
47a0: 68 65 20 6e 65 78 74 20 76 69 72 74 75 61 6c 20  he next virtual 
47b0: 74 65 72 6d 20 2a 2f 0a 0a 20 20 69 66 28 20 28  term */..  if( (
47c0: 70 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pOne->eOperator 
47d0: 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  & (WO_EQ|WO_LT|W
47e0: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
47f0: 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ))==0 ) return;.
4800: 20 20 69 66 28 20 28 70 54 77 6f 2d 3e 65 4f 70    if( (pTwo->eOp
4810: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
4820: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
4830: 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20 72  T|WO_GE))==0 ) r
4840: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 65 4f  eturn;.  if( (eO
4850: 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54  p & (WO_EQ|WO_LT
4860: 7c 57 4f 5f 4c 45 29 29 21 3d 65 4f 70 0a 20 20  |WO_LE))!=eOp.  
4870: 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f 45   && (eOp & (WO_E
4880: 51 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21  Q|WO_GT|WO_GE))!
4890: 3d 65 4f 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  =eOp ) return;. 
48a0: 20 61 73 73 65 72 74 28 20 70 4f 6e 65 2d 3e 70   assert( pOne->p
48b0: 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 26  Expr->pLeft!=0 &
48c0: 26 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70  & pOne->pExpr->p
48d0: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
48e0: 73 65 72 74 28 20 70 54 77 6f 2d 3e 70 45 78 70  sert( pTwo->pExp
48f0: 72 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  r->pLeft!=0 && p
4900: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  Two->pExpr->pRig
4910: 68 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ht!=0 );.  if( s
4920: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
4930: 65 28 30 2c 70 4f 6e 65 2d 3e 70 45 78 70 72 2d  e(0,pOne->pExpr-
4940: 3e 70 4c 65 66 74 2c 20 70 54 77 6f 2d 3e 70 45  >pLeft, pTwo->pE
4950: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 2d 31 29 20  xpr->pLeft, -1) 
4960: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4970: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
4980: 72 65 28 30 2c 70 4f 6e 65 2d 3e 70 45 78 70 72  re(0,pOne->pExpr
4990: 2d 3e 70 52 69 67 68 74 2c 20 70 54 77 6f 2d 3e  ->pRight, pTwo->
49a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 2d 31  pExpr->pRight,-1
49b0: 29 20 29 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20  ) )return;.  /* 
49c0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
49d0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
49e0: 20 74 68 65 20 74 77 6f 20 73 75 62 74 65 72 6d   the two subterm
49f0: 73 20 63 61 6e 20 62 65 20 63 6f 6d 62 69 6e 65  s can be combine
4a00: 64 20 2a 2f 0a 20 20 69 66 28 20 28 65 4f 70 20  d */.  if( (eOp 
4a10: 26 20 28 65 4f 70 2d 31 29 29 21 3d 30 20 29 7b  & (eOp-1))!=0 ){
4a20: 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 28  .    if( eOp & (
4a30: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a  WO_LT|WO_LE) ){.
4a40: 20 20 20 20 20 20 65 4f 70 20 3d 20 57 4f 5f 4c        eOp = WO_L
4a50: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
4a60: 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
4a70: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
4a80: 29 3b 0a 20 20 20 20 20 20 65 4f 70 20 3d 20 57  );.      eOp = W
4a90: 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  O_GE;.    }.  }.
4aa0: 20 20 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e    db = pWC->pWIn
4ab0: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
4ac0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
4ad0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6e 65  ExprDup(db, pOne
4ae0: 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  ->pExpr, 0);.  i
4af0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4b00: 75 72 6e 3b 0a 20 20 66 6f 72 28 6f 70 3d 54 4b  urn;.  for(op=TK
4b10: 5f 45 51 3b 20 65 4f 70 21 3d 28 57 4f 5f 45 51  _EQ; eOp!=(WO_EQ
4b20: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 20 6f  <<(op-TK_EQ)); o
4b30: 70 2b 2b 29 7b 20 61 73 73 65 72 74 28 20 6f 70  p++){ assert( op
4b40: 3c 54 4b 5f 47 45 20 29 3b 20 7d 0a 20 20 70 4e  <TK_GE ); }.  pN
4b50: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69  ew->op = op;.  i
4b60: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
4b70: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
4b80: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
4b90: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
4ba0: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70  .  exprAnalyze(p
4bb0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
4bc0: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
4bd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
4be0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
4bf0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
4c00: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4c10: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
4c20: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
4c30: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
4c40: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
4c50: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
4c60: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
4c70: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
4c80: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
4c90: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
4ca0: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
4cd0: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
4ce0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
4cf0: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
4d00: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
4d10: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
4d20: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
4d30: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
4d40: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
4d50: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
4d60: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
4d70: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
4d80: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
4d90: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
4da0: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
4db0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
4dc0: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
4dd0: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
4de0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
4df0: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
4e00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
4e10: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
4e20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
4e30: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
4e40: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
4e50: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
4e60: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
4e70: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
4e80: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
4e90: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
4ea0: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
4eb0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
4ec0: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
4ed0: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
4ee0: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
4ef0: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
4f00: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
4f10: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
4f20: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
4f30: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
4f40: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
4f50: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
4f60: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
4f70: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
4f80: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
4f90: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
4fa0: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
4fb0: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
4fc0: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
4fd0: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
4fe0: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
4ff0: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
5000: 36 29 0a 2a 2a 20 20 20 20 20 28 46 29 20 20 20  6).**     (F)   
5010: 20 20 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e    x>A OR (x=A AN
5020: 44 20 79 3e 3d 42 29 0a 2a 2a 0a 2a 2a 20 43 41  D y>=B).**.** CA
5030: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
5040: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
5050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
5060: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
5070: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
5080: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
5090: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
50a0: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
50b0: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
50c0: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
50d0: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
50e0: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
50f0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
5100: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
5110: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
5120: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
5130: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
5140: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
5150: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
5160: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
5170: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
5180: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
5190: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
51a0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
51b0: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
51c0: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SE 2:.**.** If t
51d0: 68 65 72 65 20 61 72 65 20 65 78 61 63 74 6c 79  here are exactly
51e0: 20 74 77 6f 20 64 69 73 6a 75 6e 63 74 73 20 61   two disjuncts a
51f0: 6e 64 20 6f 6e 65 20 73 69 64 65 20 68 61 73 20  nd one side has 
5200: 78 3e 41 20 61 6e 64 20 74 68 65 20 6f 74 68 65  x>A and the othe
5210: 72 20 73 69 64 65 0a 2a 2a 20 68 61 73 20 78 3d  r side.** has x=
5220: 41 20 28 66 6f 72 20 74 68 65 20 73 61 6d 65 20  A (for the same 
5230: 78 20 61 6e 64 20 41 29 20 74 68 65 6e 20 61 64  x and A) then ad
5240: 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  d a new virtual 
5250: 63 6f 6e 6a 75 6e 63 74 20 74 65 72 6d 20 74 6f  conjunct term to
5260: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
5270: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
5280: 20 22 78 3e 3d 41 22 2e 20 20 45 78 61 6d 70 6c   "x>=A".  Exampl
5290: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 3e  e:.**.**      x>
52a0: 41 20 4f 52 20 28 78 3d 41 20 41 4e 44 20 79 3e  A OR (x=A AND y>
52b0: 42 29 20 20 20 20 61 64 64 73 3a 20 20 20 20 78  B)    adds:    x
52c0: 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 64  >=A.**.** The ad
52d0: 64 65 64 20 63 6f 6e 6a 75 6e 63 74 20 63 61 6e  ded conjunct can
52e0: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 68 65   sometimes be he
52f0: 6c 70 66 75 6c 20 69 6e 20 71 75 65 72 79 20 70  lpful in query p
5300: 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 43  lanning..**.** C
5310: 41 53 45 20 33 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 3:.**.** If 
5320: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
5330: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
5340: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
5350: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
5360: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
5370: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
5380: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
5390: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
53a0: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
53b0: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
53c0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
53d0: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
53e0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
53f0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
5400: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
5410: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
5420: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
5430: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
5440: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
5450: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
5460: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
5470: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
5480: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
5490: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
54a0: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
54b0: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
54c0: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
54d0: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
54e0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
54f0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
5500: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
5510: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
5520: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
5530: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
5540: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
5550: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
5560: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
5570: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
5580: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
5590: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
55a0: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
55b0: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
55c0: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
55d0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
55e0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
55f0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
5600: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
5610: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
5620: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
5630: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
5640: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
5650: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
5660: 2a 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73  * is decided els
5670: 65 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e  ewhere.  This an
5680: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b  alysis only look
5690: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
56a0: 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72  terms.** appropr
56b0: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  iate for indexin
56c0: 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  g exist..**.** A
56d0: 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68  ll examples A th
56e0: 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61  rough E above sa
56f0: 74 69 73 66 79 20 63 61 73 65 20 33 2e 20 20 42  tisfy case 3.  B
5700: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
5710: 61 6c 73 6f 20 73 61 74 69 73 66 69 65 73 20 63  also satisfies c
5720: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
5730: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
5740: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
5750: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
5760: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
5770: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
5780: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
5790: 33 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  3 is not.** sati
57a0: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
57b0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
57c0: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
57d0: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
57e0: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
57f0: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
5800: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
5810: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
5820: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
5830: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
5840: 73 65 20 33 20 61 72 65 20 63 61 6e 64 69 64 61  se 3 are candida
5850: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
5860: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
5870: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
5880: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
5890: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
58a0: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
58b0: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
58c0: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
58d0: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
58e0: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
58f0: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
5900: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
5910: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
5920: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
5930: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
5940: 20 63 61 73 65 73 20 31 2c 20 32 2c 20 6f 72 20   cases 1, 2, or 
5950: 33 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  3 apply, then le
5960: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
5970: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
5980: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
5990: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
59a0: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
59b0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
59c0: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
59d0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
59e0: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
59f0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
5a00: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
5a10: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
5a20: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
5a30: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
5a40: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
5a50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
5a60: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
5a70: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
5a80: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
5a90: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
5aa0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
5ab0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
5ac0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5ad0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
5ae0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
5af0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5b00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5b10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5b20: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
5b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5b40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5b50: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5b60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
5b70: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
5b80: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
5b90: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
5ba0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
5bb0: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
5bc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
5bd0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
5be0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
5c20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5c30: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
5c40: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
5c50: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
5c60: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
5c70: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
5c80: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
5c90: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
5ca0: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
5cb0: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
5cc0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
5cd0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
5ce0: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
5cf0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
5d00: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
5d10: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
5d20: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
5d30: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
5d40: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
5d50: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
5d60: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
5d70: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
5d80: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
5d90: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
5da0: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
5db0: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
5dc0: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
5dd0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
5de0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
5df0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
5e00: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
5e10: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
5e20: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
5e30: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
5e40: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
5e50: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
5e60: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
5e70: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
5e80: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
5e90: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
5ea0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5eb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
5ec0: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
5ed0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
5ee0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
5ef0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
5f00: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
5f10: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
5f20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
5f30: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
5f40: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
5f50: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
5f60: 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4f 72 57  c;.  memset(pOrW
5f70: 63 2d 3e 61 53 74 61 74 69 63 2c 20 30 2c 20 73  c->aStatic, 0, s
5f80: 69 7a 65 6f 66 28 70 4f 72 57 63 2d 3e 61 53 74  izeof(pOrWc->aSt
5f90: 61 74 69 63 29 29 3b 0a 20 20 73 71 6c 69 74 65  atic));.  sqlite
5fa0: 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74  3WhereClauseInit
5fb0: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
5fc0: 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53  .  sqlite3WhereS
5fd0: 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70  plit(pOrWc, pExp
5fe0: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 73 71 6c  r, TK_OR);.  sql
5ff0: 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61  ite3WhereExprAna
6000: 6c 79 7a 65 28 70 53 72 63 2c 20 70 4f 72 57 63  lyze(pSrc, pOrWc
6010: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
6020: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
6030: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
6040: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
6050: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
6060: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
6070: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
6080: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
6090: 20 6f 72 20 33 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 3..  */.  in
60a0: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
60b0: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
60c0: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
60d0: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
60e0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
60f0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
6100: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
6110: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
6120: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
6130: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
6140: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
6150: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
6160: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
6170: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
6180: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
6190: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
61a0: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
61b0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
61c0: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
61d0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
61e0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
61f0: 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29  zeof(*pAndInfo))
6200: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  ;.      if( pAnd
6210: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
6220: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
6230: 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dWC;.        Whe
6240: 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d  reTerm *pAndTerm
6250: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
6260: 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
6270: 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   b = 0;.        
6280: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
6290: 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a  nfo = pAndInfo;.
62a0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
62b0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
62c0: 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _ANDINFO;.      
62d0: 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72    pOrTerm->eOper
62e0: 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20  ator = WO_AND;. 
62f0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20         pAndWC = 
6300: 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  &pAndInfo->wc;. 
6310: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 41         memset(pA
6320: 6e 64 57 43 2d 3e 61 53 74 61 74 69 63 2c 20 30  ndWC->aStatic, 0
6330: 2c 20 73 69 7a 65 6f 66 28 70 41 6e 64 57 43 2d  , sizeof(pAndWC-
6340: 3e 61 53 74 61 74 69 63 29 29 3b 0a 20 20 20 20  >aStatic));.    
6350: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
6360: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
6370: 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b  C, pWC->pWInfo);
6380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6390: 57 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57  WhereSplit(pAndW
63a0: 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  C, pOrTerm->pExp
63b0: 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  r, TK_AND);.    
63c0: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
63d0: 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  ExprAnalyze(pSrc
63e0: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
63f0: 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65     pAndWC->pOute
6400: 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
6410: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
6420: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6430: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
6440: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
6450: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
6460: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
6470: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
6480: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
6490: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
64a0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
64b0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
64c0: 45 78 70 72 2d 3e 6f 70 29 20 0a 20 20 20 20 20  Expr->op) .     
64d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 41 6e 64 54          || pAndT
64e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
64f0: 57 4f 5f 41 55 58 0a 20 20 20 20 20 20 20 20 20  WO_AUX.         
6500: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
6510: 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65 33      b |= sqlite3
6520: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
6530: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
6540: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
6550: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
6560: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
6570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6580: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
6590: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
65a0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
65b0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
65c0: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
65d0: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
65e0: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
65f0: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
6600: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
6610: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
6620: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
6630: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
6640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
6650: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
6660: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
6670: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
6680: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
6690: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
66a0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
66b0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
66c0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
66d0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
66e0: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
66f0: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
6700: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
6710: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
6720: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
6730: 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e  askSet, pOther->
6740: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
6750: 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78     }.      index
6760: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
6770: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
6780: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
6790: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
67a0: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
67b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67c0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62     chngToIN &= b
67d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
67e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
67f0: 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66  ecord the set of
6800: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61 74   tables that sat
6810: 69 73 66 79 20 63 61 73 65 20 33 2e 20 20 54 68  isfy case 3.  Th
6820: 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20  e set might be. 
6830: 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   ** empty..  */.
6840: 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78    pOrInfo->index
6850: 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65  able = indexable
6860: 3b 0a 20 20 69 66 28 20 69 6e 64 65 78 61 62 6c  ;.  if( indexabl
6870: 65 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  e ){.    pTerm->
6880: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4f  eOperator = WO_O
6890: 52 3b 0a 20 20 20 20 70 57 43 2d 3e 68 61 73 4f  R;.    pWC->hasO
68a0: 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 1;.  }else{.
68b0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
68c0: 61 74 6f 72 20 3d 20 57 4f 5f 4f 52 3b 0a 20 20  ator = WO_OR;.  
68d0: 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 74 77  }..  /* For a tw
68e0: 6f 2d 77 61 79 20 4f 52 2c 20 61 74 74 65 6d 70  o-way OR, attemp
68f0: 74 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t to implementat
6900: 69 6f 6e 20 63 61 73 65 20 32 2e 0a 20 20 2a 2f  ion case 2..  */
6910: 0a 20 20 69 66 28 20 69 6e 64 65 78 61 62 6c 65  .  if( indexable
6920: 20 26 26 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   && pOrWc->nTerm
6930: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
6940: 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  One = 0;.    Whe
6950: 72 65 54 65 72 6d 20 2a 70 4f 6e 65 3b 0a 20 20  reTerm *pOne;.  
6960: 20 20 77 68 69 6c 65 28 20 28 70 4f 6e 65 20 3d    while( (pOne =
6970: 20 77 68 65 72 65 4e 74 68 53 75 62 74 65 72 6d   whereNthSubterm
6980: 28 26 70 4f 72 57 63 2d 3e 61 5b 30 5d 2c 69 4f  (&pOrWc->a[0],iO
6990: 6e 65 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  ne++))!=0 ){.   
69a0: 20 20 20 69 6e 74 20 69 54 77 6f 20 3d 20 30 3b     int iTwo = 0;
69b0: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
69c0: 20 2a 70 54 77 6f 3b 0a 20 20 20 20 20 20 77 68   *pTwo;.      wh
69d0: 69 6c 65 28 20 28 70 54 77 6f 20 3d 20 77 68 65  ile( (pTwo = whe
69e0: 72 65 4e 74 68 53 75 62 74 65 72 6d 28 26 70 4f  reNthSubterm(&pO
69f0: 72 57 63 2d 3e 61 5b 31 5d 2c 69 54 77 6f 2b 2b  rWc->a[1],iTwo++
6a00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
6a10: 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44 69 73   whereCombineDis
6a20: 6a 75 6e 63 74 73 28 70 53 72 63 2c 20 70 57 43  juncts(pSrc, pWC
6a30: 2c 20 70 4f 6e 65 2c 20 70 54 77 6f 29 3b 0a 20  , pOne, pTwo);. 
6a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a50: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  /*.  ** chng
6a60: 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74  ToIN holds a set
6a70: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
6a80: 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79 20  *might* satisfy 
6a90: 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a  case 1.  But.  *
6aa0: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20  * we have to do 
6ab0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
6ac0: 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
6ad0: 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79  if case 1 really
6ae0: 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69  .  ** is satisfi
6af0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68  ed..  **.  ** ch
6b00: 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64  ngToIN will hold
6b10: 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72   either 0, 1, or
6b20: 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d   2 bits.  The 0-
6b30: 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20  bit case means. 
6b40: 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69   ** that there i
6b50: 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79  s no possibility
6b60: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
6b70: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
6b80: 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f  nto an.  ** IN o
6b90: 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20  perator because 
6ba0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  one or more term
6bb0: 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  s in the OR clau
6bc0: 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20  se contain.  ** 
6bd0: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
6be0: 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c  than == on a col
6bf0: 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c  umn in the singl
6c00: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d  e table.  The 1-
6c10: 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65  bit.  ** case me
6c20: 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20 74  ans that every t
6c30: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
6c40: 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20 66  ause is of the f
6c50: 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e  orm.  ** "table.
6c60: 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72  column=expr" for
6c70: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62   some single tab
6c80: 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74  le.  The one bit
6c90: 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a   that is set.  *
6ca0: 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  * will correspon
6cb0: 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  d to the common 
6cc0: 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c  table.  We still
6cd0: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74   need to check t
6ce0: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  o make.  ** sure
6cf0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
6d00: 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20   is used on all 
6d10: 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69  terms.  The 2-bi
6d20: 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20  t case is when. 
6d30: 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d   ** the all term
6d40: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6d50: 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  m "table1.column
6d60: 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e  =table2.column".
6d70: 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20    It.  ** might 
6d80: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  be possible to f
6d90: 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  orm an IN operat
6da0: 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20 74  or with either t
6db0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a  able1.column.  *
6dc0: 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75  * or table2.colu
6dd0: 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69 66  mn as the LHS if
6de0: 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f   either is commo
6df0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
6e00: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63  of.  ** the OR c
6e10: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
6e20: 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73   Note that terms
6e30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
6e40: 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c  ble.column1=tabl
6e50: 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a  e.column2" (the.
6e60: 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20    ** same table 
6e70: 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66  on both sizes of
6e80: 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20   the ==) cannot 
6e90: 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20  be optimized..  
6ea0: 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49  */.  if( chngToI
6eb0: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54  N ){.    int okT
6ec0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20  oChngToIN = 0;  
6ed0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6ee0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  e conversion to 
6ef0: 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  IN is valid */. 
6f00: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d     int iColumn =
6f10: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
6f20: 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20  Column index on 
6f30: 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  lhs of IN operat
6f40: 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  or */.    int iC
6f50: 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20  ursor = -1;     
6f60: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
6f70: 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  sor common to al
6f80: 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  l terms */.    i
6f90: 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20  nt j = 0;       
6fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6fb0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
6fc0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
6fd0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
6fe0: 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  n that appears o
6ff0: 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  n one side or th
7000: 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f  e.    ** other o
7010: 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f  f the == operato
7020: 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74 65  r in every subte
7030: 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  rm.  That table 
7040: 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  and column.    *
7050: 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  * will be record
7060: 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e  ed in iCursor an
7070: 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72  d iColumn.  Ther
7080: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
7090: 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74  ny.    ** such t
70a0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
70b0: 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    Set okToChngTo
70c0: 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  IN if an appropr
70d0: 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a  iate table.    *
70e0: 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  * and column is 
70f0: 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20  found but leave 
7100: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c  okToChngToIN fal
7110: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  se if not found.
7120: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7130: 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54  j=0; j<2 && !okT
7140: 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b  oChngToIN; j++){
7150: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
7160: 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  ft = 0;.      pO
7170: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
7180: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
7190: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
71a0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
71b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
71c0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
71d0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
71e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
71f0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
7200: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
7210: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7220: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
7230: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
7240: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7250: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
7260: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
7270: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
7280: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
7290: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
72a0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
72b0: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
72c0: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
72d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
72e0: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
72f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7310: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
7320: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
7330: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7340: 61 73 6b 53 65 74 2c 0a 20 20 20 20 20 20 20 20  askSet,.        
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66      pOrTerm->lef
7380: 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a  tCursor))==0 ){.
7390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
73a0: 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f  s term must be o
73b0: 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d  f the form t1.a=
73c0: 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69  =t2.b where t2 i
73d0: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
73e0: 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73     ** chngToIN s
73f0: 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74  et but t1 is not
7400: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c  .  This term wil
7410: 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63  l be either prec
7420: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
7430: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
7440: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
7450: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
7460: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
7470: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
7480: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
7490: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
74a0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
74b0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
74c0: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
74d0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
74e0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
74f0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
7500: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
7510: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
7520: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
7530: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
7540: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
7550: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7560: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
7570: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
7580: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
7590: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
75a0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
75b0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  sor;.        pLe
75c0: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
75d0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
75e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
75f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30   }.      if( i<0
7600: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
7610: 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  o candidate tabl
7620: 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75  e+column was fou
7630: 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  nd.  This can on
7640: 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20  ly occur.       
7650: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e   ** on the secon
7660: 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  d iteration */. 
7670: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
7680: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
7690: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
76a0: 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b  Two(chngToIN) );
76b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
76c0: 20 63 68 6e 67 54 6f 49 4e 3d 3d 73 71 6c 69 74   chngToIN==sqlit
76d0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
76e0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
76f0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
7700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7710: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
7720: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
7730: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
7740: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
7750: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
7760: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
7770: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
7780: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
7790: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
77a0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
77b0: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
77c0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
77d0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
77e0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
77f0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
7800: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
7810: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
7820: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7830: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
7840: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
7850: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
7870: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7880: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
7890: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
78a0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
78b0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
78c0: 7c 7c 20 28 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  || (iColumn==XN_
78d0: 45 58 50 52 20 0a 20 20 20 20 20 20 20 20 20 20  EXPR .          
78e0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
78f0: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
7900: 65 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  e, pOrTerm->pExp
7910: 72 2d 3e 70 4c 65 66 74 2c 20 70 4c 65 66 74 2c  r->pLeft, pLeft,
7920: 20 2d 31 29 0a 20 20 20 20 20 20 20 20 29 29 7b   -1).        )){
7930: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43  .          okToC
7940: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
7950: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7960: 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66        int affLef
7970: 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20  t, affRight;.   
7980: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7990: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
79a0: 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d   is also a colum
79b0: 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  n, then the affi
79c0: 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20  nities.         
79d0: 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68   ** of both righ
79e0: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73  t and left sides
79f0: 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68   must be such th
7a00: 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20  at no type.     
7a10: 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69       ** conversi
7a20: 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ons are required
7a30: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20   on the right.  
7a40: 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20  (Ticket #2249). 
7a50: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
7a60: 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d        affRight =
7a70: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
7a80: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
7a90: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
7aa0: 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20          affLeft 
7ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
7ac0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
7ad0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
7ae0: 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52          if( affR
7af0: 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69  ight!=0 && affRi
7b00: 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a  ght!=affLeft ){.
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f              okTo
7b20: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
7b30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7b40: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65             pOrTe
7b50: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
7b60: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
7b90: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
7ba0: 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f  oint, okToChngTo
7bb0: 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72  IN is true if or
7bc0: 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74  iginal pTerm sat
7bd0: 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61  isfies.    ** ca
7be0: 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63  se 1.  In that c
7bf0: 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61  ase, construct a
7c00: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
7c10: 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a  m that is .    *
7c20: 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65  * pTerm converte
7c30: 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  d into an IN ope
7c40: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
7c50: 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f    if( okToChngTo
7c60: 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
7c70: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
7c80: 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e     /* A transien
7c90: 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72  t duplicate expr
7ca0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
7cb0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
7cc0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48  = 0;   /* The RH
7cd0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
7ce0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
7cf0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20  pr *pLeft = 0;  
7d00: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
7d10: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
7d20: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  or */.      Expr
7d30: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
7d40: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
7d50: 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  te IN operator *
7d60: 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  /..      for(i=p
7d70: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
7d80: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
7d90: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
7da0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
7db0: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  if( (pOrTerm->wt
7dc0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  Flags & TERM_OR_
7dd0: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
7de0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
7df0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
7e00: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
7e10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e20: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
7e30: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b  rsor==iCursor );
7e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e50: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
7e60: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
7e70: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  );.        pDup 
7e80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7e90: 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  (db, pOrTerm->pE
7ea0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
7eb0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
7ec0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7ed0: 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70  Append(pWInfo->p
7ee0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44  Parse, pList, pD
7ef0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  up);.        pLe
7f00: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
7f10: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
7f20: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
7f30: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
7f40: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
7f50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
7f60: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
7f70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7f80: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
7f90: 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20  , pDup, 0);.    
7fa0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
7fb0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
7fc0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
7fd0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
7fe0: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
7ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
8000: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
8010: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
8020: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
8030: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
8040: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
8050: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
8060: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
8070: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
8080: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
8090: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
80a0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
80b0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
80c0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
80d0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ew);.        /* 
80e0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
80f0: 69 64 78 54 65 72 6d 5d 3b 20 2f 2f 20 77 6f 75  idxTerm]; // wou
8100: 6c 64 20 62 65 20 6e 65 65 64 65 64 20 69 66 20  ld be needed if 
8110: 70 54 65 72 6d 20 77 68 65 72 65 20 75 73 65 64  pTerm where used
8120: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
8130: 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c    markTermAsChil
8140: 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69  d(pWC, idxNew, i
8150: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d  dxTerm);.      }
8160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8170: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8180: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
8190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
81a0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
81b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
81c0: 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53  TIMIZATION && !S
81d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
81e0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 65  ERY */../*.** We
81f0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
8200: 61 74 20 70 45 78 70 72 20 69 73 20 61 20 62 69  at pExpr is a bi
8210: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 77 68  nary operator wh
8220: 65 72 65 20 62 6f 74 68 20 6f 70 65 72 61 6e 64  ere both operand
8230: 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  s are.** column 
8240: 72 65 66 65 72 65 6e 63 65 73 2e 20 20 54 68 69  references.  Thi
8250: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
8260: 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
8270: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
8280: 63 65 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 3a 0a  ce.** relation:.
8290: 2a 2a 20 20 20 31 2e 20 20 54 68 65 20 53 51 4c  **   1.  The SQL
82a0: 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20 6f  ITE_Transitive o
82b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74  ptimization must
82c0: 20 62 65 20 65 6e 61 62 6c 65 64 0a 2a 2a 20 20   be enabled.**  
82d0: 20 32 2e 20 20 4d 75 73 74 20 62 65 20 65 69 74   2.  Must be eit
82e0: 68 65 72 20 61 6e 20 3d 3d 20 6f 72 20 61 6e 20  her an == or an 
82f0: 49 53 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 20  IS operator.**  
8300: 20 33 2e 20 20 4e 6f 74 20 6f 72 69 67 69 6e 61   3.  Not origina
8310: 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 4e 20 63  ting in the ON c
8320: 6c 61 75 73 65 20 6f 66 20 61 6e 20 4f 55 54 45  lause of an OUTE
8330: 52 20 4a 4f 49 4e 0a 2a 2a 20 20 20 34 2e 20 20  R JOIN.**   4.  
8340: 54 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 6f  The affinities o
8350: 66 20 41 20 61 6e 64 20 42 20 6d 75 73 74 20 62  f A and B must b
8360: 65 20 63 6f 6d 70 61 74 69 62 6c 65 0a 2a 2a 20  e compatible.** 
8370: 20 20 35 61 2e 20 42 6f 74 68 20 6f 70 65 72 61    5a. Both opera
8380: 6e 64 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  nds use the same
8390: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
83a0: 6e 63 65 20 4f 52 0a 2a 2a 20 20 20 35 62 2e 20  nce OR.**   5b. 
83b0: 54 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 6c 6c  The overall coll
83c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
83d0: 73 20 42 49 4e 41 52 59 0a 2a 2a 20 49 66 20 74  s BINARY.** If t
83e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
83f0: 72 6e 73 20 54 52 55 45 2c 20 74 68 61 74 20 6d  rns TRUE, that m
8400: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 52 48  eans that the RH
8410: 53 20 63 61 6e 20 62 65 20 73 75 62 73 74 69 74  S can be substit
8420: 75 74 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  uted.** for the 
8430: 4c 48 53 20 61 6e 79 70 6c 61 63 65 20 65 6c 73  LHS anyplace els
8440: 65 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  e in the WHERE c
8450: 6c 61 75 73 65 20 77 68 65 72 65 20 74 68 65 20  lause where the 
8460: 4c 48 53 20 63 6f 6c 75 6d 6e 20 6f 63 63 75 72  LHS column occur
8470: 73 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  s..** This is an
8480: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
8490: 4e 6f 20 68 61 72 6d 20 63 6f 6d 65 73 20 66 72  No harm comes fr
84a0: 6f 6d 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 20  om returning 0. 
84b0: 20 42 75 74 20 69 66 20 31 20 69 73 0a 2a 2a 20   But if 1 is.** 
84c0: 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 69 74  returned when it
84d0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 2c 20   should not be, 
84e0: 74 68 65 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  then incorrect a
84f0: 6e 73 77 65 72 73 20 6d 69 67 68 74 20 72 65 73  nswers might res
8500: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
8510: 6e 74 20 74 65 72 6d 49 73 45 71 75 69 76 61 6c  nt termIsEquival
8520: 65 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72  ence(Parse *pPar
8530: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
8540: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 2c 20 61  {.  char aff1, a
8550: 66 66 32 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ff2;.  CollSeq *
8560: 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 21 4f 70  pColl;.  if( !Op
8570: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
8580: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
8590: 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29  LITE_Transitive)
85a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
85b0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
85c0: 5f 45 51 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _EQ && pExpr->op
85d0: 21 3d 54 4b 5f 49 53 20 29 20 72 65 74 75 72 6e  !=TK_IS ) return
85e0: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
85f0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
8600: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
8610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 31  return 0;.  aff1
8620: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
8630: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
8640: 65 66 74 29 3b 0a 20 20 61 66 66 32 20 3d 20 73  eft);.  aff2 = s
8650: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8660: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
8670: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 21 3d 61  );.  if( aff1!=a
8680: 66 66 32 0a 20 20 20 26 26 20 28 21 73 71 6c 69  ff2.   && (!sqli
8690: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
86a0: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 21 73  nity(aff1) || !s
86b0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
86c0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 29 0a 20  ffinity(aff2)). 
86d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
86e0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
86f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
8700: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
8710: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
8720: 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28  sqlite3IsBinary(
8730: 70 43 6f 6c 6c 29 20 29 20 72 65 74 75 72 6e 20  pColl) ) return 
8740: 31 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  1;.  return sqli
8750: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61  te3ExprCollSeqMa
8760: 74 63 68 28 70 50 61 72 73 65 2c 20 70 45 78 70  tch(pParse, pExp
8770: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
8780: 3e 70 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >pRight);.}../*.
8790: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77  ** Recursively w
87a0: 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  alk the expressi
87b0: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
87c0: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 65  statement and ge
87d0: 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d  nerate.** a bitm
87e0: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
87f0: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
8800: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
8810: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
8820: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
8830: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 55 73 61  sk exprSelectUsa
8840: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
8850: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
8860: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
8870: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68  k mask = 0;.  wh
8880: 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53  ile( pS ){.    S
8890: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
88a0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73  S->pSrc;.    mas
88b0: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  k |= sqlite3Wher
88c0: 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
88d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
88e0: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
88f0: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
8900: 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
8910: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
8920: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
8930: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
8940: 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
8950: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
8960: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
8970: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
8980: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
8990: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
89a0: 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33   mask |= sqlite3
89b0: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70  WhereExprUsage(p
89c0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
89d0: 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41  ving);.    if( A
89e0: 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29  LWAYS(pSrc!=0) )
89f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8a00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8a10: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
8a20: 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  {.        mask |
8a30: 3d 20 65 78 70 72 53 65 6c 65 63 74 55 73 61 67  = exprSelectUsag
8a40: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
8a50: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
8a60: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
8a70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
8a80: 72 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  rUsage(pMaskSet,
8a90: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
8aa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
8ab0: 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 54 61  rc->a[i].fg.isTa
8ac0: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  bFunc ){.       
8ad0: 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74     mask |= sqlit
8ae0: 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
8af0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
8b00: 53 72 63 2d 3e 61 5b 69 5d 2e 75 31 2e 70 46 75  Src->a[i].u1.pFu
8b10: 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ncArg);.        
8b20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8b30: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
8b40: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
8b50: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
8b60: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
8b70: 72 20 69 73 20 6f 6e 65 20 6f 70 65 72 61 6e 64  r is one operand
8b80: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
8b90: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 6d   operator that m
8ba0: 69 67 68 74 0a 2a 2a 20 62 65 20 75 73 65 66 75  ight.** be usefu
8bb0: 6c 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 2e 20  l for indexing. 
8bc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8bd0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
8be0: 45 78 70 72 20 61 70 70 65 61 72 73 0a 2a 2a 20  Expr appears.** 
8bf0: 69 6e 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 52  in any index.  R
8c00: 65 74 75 72 6e 20 54 52 55 45 20 28 31 29 20 69  eturn TRUE (1) i
8c10: 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 69 6e  f pExpr is an in
8c20: 64 65 78 65 64 20 74 65 72 6d 20 61 6e 64 20 72  dexed term and r
8c30: 65 74 75 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 28  eturn.** FALSE (
8c40: 30 29 20 69 66 20 6e 6f 74 2e 20 20 49 66 20 54  0) if not.  If T
8c50: 52 55 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c  RUE is returned,
8c60: 20 61 6c 73 6f 20 73 65 74 20 61 69 43 75 72 43   also set aiCurC
8c70: 6f 6c 5b 30 5d 20 74 6f 20 74 68 65 20 63 75 72  ol[0] to the cur
8c80: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  sor.** number of
8c90: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
8ca0: 69 73 20 69 6e 64 65 78 65 64 20 61 6e 64 20 61  is indexed and a
8cb0: 69 43 75 72 43 6f 6c 5b 31 5d 20 74 6f 20 74 68  iCurCol[1] to th
8cc0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 0a  e column number.
8cd0: 2a 2a 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ** of the column
8ce0: 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
8cf0: 2c 20 6f 72 20 58 4e 5f 45 58 50 52 20 28 2d 32  , or XN_EXPR (-2
8d00: 29 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  ) if an expressi
8d10: 6f 6e 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 69  on is being.** i
8d20: 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ndexed..**.** If
8d30: 20 70 45 78 70 72 20 69 73 20 61 20 54 4b 5f 43   pExpr is a TK_C
8d40: 4f 4c 55 4d 4e 20 63 6f 6c 75 6d 6e 20 72 65 66  OLUMN column ref
8d50: 65 72 65 6e 63 65 2c 20 74 68 65 6e 20 74 68 69  erence, then thi
8d60: 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73  s routine always
8d70: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65   returns.** true
8d80: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 70 61   even if that pa
8d90: 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
8da0: 69 73 20 6e 6f 74 20 69 6e 64 65 78 65 64 2c 20  is not indexed, 
8db0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6c 75  because the colu
8dc0: 6d 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 61  mn.** might be a
8dd0: 64 64 65 64 20 74 6f 20 61 6e 20 61 75 74 6f 6d  dded to an autom
8de0: 61 74 69 63 20 69 6e 64 65 78 20 6c 61 74 65 72  atic index later
8df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8e00: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
8e10: 65 78 70 72 4d 69 67 68 74 42 65 49 6e 64 65 78  exprMightBeIndex
8e20: 65 64 32 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  ed2(.  SrcList *
8e30: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 2f 2a  pFrom,        /*
8e40: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
8e50: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
8e60: 72 65 72 65 71 2c 20 20 20 20 20 20 20 2f 2a 20  rereq,       /* 
8e70: 42 69 74 6d 61 73 6b 20 6f 66 20 46 52 4f 4d 20  Bitmask of FROM 
8e80: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 72 65 66  clause terms ref
8e90: 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70 72  erenced by pExpr
8ea0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 43 75 72   */.  int *aiCur
8eb0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
8ec0: 57 72 69 74 65 20 74 68 65 20 72 65 66 65 72 65  Write the refere
8ed0: 6e 63 65 64 20 74 61 62 6c 65 20 63 75 72 73 6f  nced table curso
8ee0: 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 68 65 72  r and column her
8ef0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
8f00: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
8f10: 20 41 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   An operand of a
8f20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
8f30: 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  ator */.){.  Ind
8f40: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
8f50: 69 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  i;.  int iCur;. 
8f60: 20 66 6f 72 28 69 3d 30 3b 20 6d 50 72 65 72 65   for(i=0; mPrere
8f70: 71 3e 31 3b 20 69 2b 2b 2c 20 6d 50 72 65 72 65  q>1; i++, mPrere
8f80: 71 3e 3e 3d 31 29 7b 7d 0a 20 20 69 43 75 72 20  q>>=1){}.  iCur 
8f90: 3d 20 70 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 69 43  = pFrom->a[i].iC
8fa0: 75 72 73 6f 72 3b 0a 20 20 66 6f 72 28 70 49 64  ursor;.  for(pId
8fb0: 78 3d 70 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 70 54  x=pFrom->a[i].pT
8fc0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
8fd0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
8fe0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64  xt){.    if( pId
8ff0: 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29  x->aColExpr==0 )
9000: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
9010: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
9020: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
9030: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9040: 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d 58 4e 5f 45  iColumn[i]!=XN_E
9050: 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  XPR ) continue;.
9060: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9070: 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
9080: 28 70 45 78 70 72 2c 20 70 49 64 78 2d 3e 61 43  (pExpr, pIdx->aC
9090: 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78  olExpr->a[i].pEx
90a0: 70 72 2c 20 69 43 75 72 29 3d 3d 30 20 29 7b 0a  pr, iCur)==0 ){.
90b0: 20 20 20 20 20 20 20 20 61 69 43 75 72 43 6f 6c          aiCurCol
90c0: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  [0] = iCur;.    
90d0: 20 20 20 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20      aiCurCol[1] 
90e0: 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
90f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9110: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61   return 0;.}.sta
9120: 74 69 63 20 69 6e 74 20 65 78 70 72 4d 69 67 68  tic int exprMigh
9130: 74 42 65 49 6e 64 65 78 65 64 28 0a 20 20 53 72  tBeIndexed(.  Sr
9140: 63 4c 69 73 74 20 2a 70 46 72 6f 6d 2c 20 20 20  cList *pFrom,   
9150: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
9160: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
9170: 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
9180: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
9190: 66 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  f FROM clause te
91a0: 72 6d 73 20 72 65 66 65 72 65 6e 63 65 64 20 62  rms referenced b
91b0: 79 20 70 45 78 70 72 20 2a 2f 0a 20 20 69 6e 74  y pExpr */.  int
91c0: 20 2a 61 69 43 75 72 43 6f 6c 2c 20 20 20 20 20   *aiCurCol,     
91d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
91e0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
91f0: 65 20 63 75 72 73 6f 72 20 26 20 63 6f 6c 75 6d  e cursor & colum
9200: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  n here */.  Expr
9210: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
9220: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 72 61 6e 64     /* An operand
9230: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
9240: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
9250: 6e 74 20 6f 70 20 20 20 20 20 20 20 20 20 20 20  nt op           
9260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
9270: 63 69 66 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e  cific comparison
9280: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
9290: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 65 78 70    /* If this exp
92a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
92b0: 74 6f 72 20 74 6f 20 74 68 65 20 6c 65 66 74 20  tor to the left 
92c0: 6f 72 20 72 69 67 68 74 20 6f 66 20 61 20 0a 20  or right of a . 
92d0: 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 20 63   ** inequality c
92e0: 6f 6e 73 74 72 61 69 6e 74 20 28 3e 2c 20 3c 2c  onstraint (>, <,
92f0: 20 3e 3d 20 6f 72 20 3c 3d 29 2c 20 70 65 72 66   >= or <=), perf
9300: 6f 72 6d 20 74 68 65 20 70 72 6f 63 65 73 73 69  orm the processi
9310: 6e 67 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ng .  ** on the 
9320: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
9330: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 20 2a 2f   the vector.  */
9340: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
9350: 2b 31 3d 3d 54 4b 5f 4c 45 20 26 26 20 54 4b 5f  +1==TK_LE && TK_
9360: 47 54 2b 32 3d 3d 54 4b 5f 4c 54 20 26 26 20 54  GT+2==TK_LT && T
9370: 4b 5f 47 54 2b 33 3d 3d 54 4b 5f 47 45 20 29 3b  K_GT+3==TK_GE );
9380: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53  .  assert( TK_IS
9390: 3c 54 4b 5f 47 45 20 26 26 20 54 4b 5f 49 53 4e  <TK_GE && TK_ISN
93a0: 55 4c 4c 3c 54 4b 5f 47 45 20 26 26 20 54 4b 5f  ULL<TK_GE && TK_
93b0: 49 4e 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  IN<TK_GE );.  as
93c0: 73 65 72 74 28 20 6f 70 3c 3d 54 4b 5f 47 45 20  sert( op<=TK_GE 
93d0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
93e0: 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 26 26  op==TK_VECTOR &&
93f0: 20 28 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 41   (op>=TK_GT && A
9400: 4c 57 41 59 53 28 6f 70 3c 3d 54 4b 5f 47 45 29  LWAYS(op<=TK_GE)
9410: 29 20 29 7b 0a 20 20 20 20 70 45 78 70 72 20 3d  ) ){.    pExpr =
9420: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
9430: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 7d  >a[0].pExpr;.  }
9440: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
9450: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
9460: 20 20 20 20 61 69 43 75 72 43 6f 6c 5b 30 5d 20      aiCurCol[0] 
9470: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
9480: 0a 20 20 20 20 61 69 43 75 72 43 6f 6c 5b 31 5d  .    aiCurCol[1]
9490: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
94a0: 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  n;.    return 1;
94b0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 50 72 65 72  .  }.  if( mPrer
94c0: 65 71 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  eq==0 ) return 0
94d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
94e0: 20 20 2f 2a 20 4e 6f 20 74 61 62 6c 65 20 72 65    /* No table re
94f0: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 69 66  ferences */.  if
9500: 28 20 28 6d 50 72 65 72 65 71 26 28 6d 50 72 65  ( (mPrereq&(mPre
9510: 72 65 71 2d 31 29 29 21 3d 30 20 29 20 72 65 74  req-1))!=0 ) ret
9520: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 66 73  urn 0;   /* Refs
9530: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
9540: 61 62 6c 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e  able */.  return
9550: 20 65 78 70 72 4d 69 67 68 74 42 65 49 6e 64 65   exprMightBeInde
9560: 78 65 64 32 28 70 46 72 6f 6d 2c 6d 50 72 65 72  xed2(pFrom,mPrer
9570: 65 71 2c 61 69 43 75 72 43 6f 6c 2c 70 45 78 70  eq,aiCurCol,pExp
9580: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  r);.}../*.** The
9590: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
95a0: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
95b0: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
95c0: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
95d0: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
95e0: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
95f0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
9600: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
9610: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
9620: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
9630: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
9640: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
9650: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
9660: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
9670: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9680: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9690: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
96a0: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
96b0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
96c0: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
96d0: 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a  p> <expr>"..**.*
96e0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
96f0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9700: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
9710: 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59  ere both X and Y
9720: 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c   are.** columns,
9730: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
9740: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  al expression is
9750: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
9760: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
9770: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
9780: 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61   "Y <op> X" is a
9790: 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  dded to the WHER
97a0: 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20  E clause and.** 
97b0: 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74  analyzed separat
97c0: 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ely.  The origin
97d0: 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65  al term is marke
97e0: 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49  d with TERM_COPI
97f0: 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65  ED.** and the ne
9800: 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  w term is marked
9810: 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d   with TERM_DYNAM
9820: 49 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73  IC (because it's
9830: 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20   pExpr.** needs 
9840: 74 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68  to be freed with
9850: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
9860: 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55  ) and TERM_VIRTU
9870: 41 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a  AL (because it.*
9880: 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20  * is a commuted 
9890: 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20  copy of a prior 
98a0: 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67  term.)  The orig
98b0: 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43  inal term has nC
98c0: 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68  hild=1.** and th
98d0: 65 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61  e copy has idxPa
98e0: 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20  rent set to the 
98f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69  index of the ori
9900: 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73  ginal term..*/.s
9910: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
9920: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
9930: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
9940: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
9950: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
9960: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9970: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
9980: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
9990: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
99a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
99b0: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
99c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
99d0: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
99e0: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
99f0: 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63  Info; /* WHERE c
9a00: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
9a10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
9a20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a40: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
9a50: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57   analyzed */.  W
9a60: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
9a70: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  skSet;          
9a80: 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20  /* Set of table 
9a90: 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20  index masks */. 
9aa0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
9ad0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
9ae0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
9af0: 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20  prereqLeft;     
9b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
9b10: 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65  equesites of the
9b20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f   pExpr->pLeft */
9b30: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
9b40: 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  qAll;           
9b50: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
9b60: 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f  ites of pExpr */
9b70: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
9b80: 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20  Right = 0;      
9b90: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70      /* Extra dep
9ba0: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46  endencies on LEF
9bb0: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72  T JOIN */.  Expr
9bc0: 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20   *pStr1 = 0;    
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9be0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
9bf0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
9c00: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20  nt isComplete = 
9c10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9c20: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
9c30: 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69  LOB ends with wi
9c40: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20  ldcard */.  int 
9c50: 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20  noCase = 0;     
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c70: 75 70 70 65 72 63 61 73 65 20 65 71 75 69 76 61  uppercase equiva
9c80: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
9c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  e */.  int op;  
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c          /* Top-l
9cc0: 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20  evel operator.  
9cd0: 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50  pExpr->op */.  P
9ce0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
9cf0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
9d00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9d10: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
9d20: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9d30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
9d40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9d50: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9d60: 61 72 20 65 4f 70 32 20 3d 20 30 3b 20 20 20 20  ar eOp2 = 0;    
9d70: 20 20 20 20 20 20 2f 2a 20 6f 70 32 20 76 61 6c        /* op2 val
9d80: 75 65 20 66 6f 72 20 4c 49 4b 45 2f 52 45 47 45  ue for LIKE/REGE
9d90: 58 50 2f 47 4c 4f 42 20 2a 2f 0a 20 20 69 6e 74  XP/GLOB */.  int
9da0: 20 6e 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20   nLeft;         
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9dc0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
9dd0: 6e 74 73 20 6f 6e 20 6c 65 66 74 20 73 69 64 65  nts on left side
9de0: 20 76 65 63 74 6f 72 20 2a 2f 0a 0a 20 20 69 66   vector */..  if
9df0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9e00: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9e10: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
9e20: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
9e30: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
9e40: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
9e50: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
9e60: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
9e70: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
9e80: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
9e90: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
9ea0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
9eb0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
9ec0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9ed0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9ee0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
9ef0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
9f00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9f10: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
9f20: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
9f30: 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
9f40: 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
9f50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
9f60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9f70: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
9f80: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
9f90: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
9fa0: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 55 73 61   = exprSelectUsa
9fb0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9fc0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
9fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9fe0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9ff0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ght = sqlite3Whe
a000: 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
a010: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a020: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
a030: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a040: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
a050: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a060: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
a070: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
a080: 65 72 65 71 52 69 67 68 74 20 3d 20 73 71 6c 69  ereqRight = sqli
a090: 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
a0a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a0b0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
a0c0: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 62 56 61 72    pMaskSet->bVar
a0d0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 72  Select = 0;.  pr
a0e0: 65 72 65 71 41 6c 6c 20 3d 20 73 71 6c 69 74 65  ereqAll = sqlite
a0f0: 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 4e  3WhereExprUsageN
a100: 4e 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  N(pMaskSet, pExp
a110: 72 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 6b 53  r);.  if( pMaskS
a120: 65 74 2d 3e 62 56 61 72 53 65 6c 65 63 74 20 29  et->bVarSelect )
a130: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a140: 7c 3d 20 54 45 52 4d 5f 56 41 52 53 45 4c 45 43  |= TERM_VARSELEC
a150: 54 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  T;.  if( ExprHas
a160: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a170: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
a180: 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20      Bitmask x = 
a190: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
a1a0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
a1b0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
a1c0: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
a1d0: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
a1e0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
a1f0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
a200: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
a210: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
a220: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
a230: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
a240: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
a250: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
a260: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 20 20  et #3015 */.    
a270: 69 66 28 20 28 70 72 65 72 65 71 41 6c 6c 3e 3e  if( (prereqAll>>
a280: 31 29 3e 3d 78 20 29 7b 0a 20 20 20 20 20 20 73  1)>=x ){.      s
a290: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a2a0: 50 61 72 73 65 2c 20 22 4f 4e 20 63 6c 61 75 73  Parse, "ON claus
a2b0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62  e references tab
a2c0: 6c 65 73 20 74 6f 20 69 74 73 20 72 69 67 68 74  les to its right
a2d0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
a2e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
a2f0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
a300: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
a310: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
a320: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
a330: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
a340: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a350: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
a360: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
a370: 69 6e 74 20 61 69 43 75 72 43 6f 6c 5b 32 5d 3b  int aiCurCol[2];
a380: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
a390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a3a0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
a3b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
a3c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
a3d0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
a3e0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
a3f0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
a400: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
a410: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
a420: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
a430: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 0a 20  L : WO_EQUIV;.. 
a440: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 46     if( pTerm->iF
a450: 69 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ield>0 ){.      
a460: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 49  assert( op==TK_I
a470: 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
a480: 74 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  t( pLeft->op==TK
a490: 5f 56 45 43 54 4f 52 20 29 3b 0a 20 20 20 20 20  _VECTOR );.     
a4a0: 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e   pLeft = pLeft->
a4b0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 70 54 65 72 6d  x.pList->a[pTerm
a4c0: 2d 3e 69 46 69 65 6c 64 2d 31 5d 2e 70 45 78 70  ->iField-1].pExp
a4d0: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
a4e0: 28 20 65 78 70 72 4d 69 67 68 74 42 65 49 6e 64  ( exprMightBeInd
a4f0: 65 78 65 64 28 70 53 72 63 2c 20 70 72 65 72 65  exed(pSrc, prere
a500: 71 4c 65 66 74 2c 20 61 69 43 75 72 43 6f 6c 2c  qLeft, aiCurCol,
a510: 20 70 4c 65 66 74 2c 20 6f 70 29 20 29 7b 0a 20   pLeft, op) ){. 
a520: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
a530: 43 75 72 73 6f 72 20 3d 20 61 69 43 75 72 43 6f  Cursor = aiCurCo
a540: 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  l[0];.      pTer
a550: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
a560: 3d 20 61 69 43 75 72 43 6f 6c 5b 31 5d 3b 0a 20  = aiCurCol[1];. 
a570: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
a580: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
a590: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
a5a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
a5b0: 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 20 70 54 65   op==TK_IS ) pTe
a5c0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
a5d0: 45 52 4d 5f 49 53 3b 0a 20 20 20 20 69 66 28 20  ERM_IS;.    if( 
a5e0: 70 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20  pRight .     && 
a5f0: 65 78 70 72 4d 69 67 68 74 42 65 49 6e 64 65 78  exprMightBeIndex
a600: 65 64 28 70 53 72 63 2c 20 70 54 65 72 6d 2d 3e  ed(pSrc, pTerm->
a610: 70 72 65 72 65 71 52 69 67 68 74 2c 20 61 69 43  prereqRight, aiC
a620: 75 72 43 6f 6c 2c 20 70 52 69 67 68 74 2c 20 6f  urCol, pRight, o
a630: 70 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  p).    ){.      
a640: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
a650: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
a660: 70 3b 0a 20 20 20 20 20 20 75 31 36 20 65 45 78  p;.      u16 eEx
a670: 74 72 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20  traOp = 0;      
a680: 20 20 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20    /* Extra bits 
a690: 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61  for pNew->eOpera
a6a0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  tor */.      ass
a6b0: 65 72 74 28 20 70 54 65 72 6d 2d 3e 69 46 69 65  ert( pTerm->iFie
a6c0: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ld==0 );.      i
a6d0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
a6e0: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
a6f0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
a700: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
a710: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a720: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
a730: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
a740: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a760: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70  rDelete(db, pDup
a770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
a780: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
a790: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
a7a0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
a7b0: 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52  t(pWC, pDup, TER
a7c0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
a7d0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
a7e0: 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29   if( idxNew==0 )
a7f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a800: 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b   pNew = &pWC->a[
a810: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20  idxNew];.       
a820: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
a830: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
a840: 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  xTerm);.        
a850: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 20  if( op==TK_IS ) 
a860: 70 4e 65 77 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  pNew->wtFlags |=
a870: 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20 20 20   TERM_IS;.      
a880: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
a890: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
a8a0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
a8b0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
a8c0: 44 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  D;..        if( 
a8d0: 74 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e 63  termIsEquivalenc
a8e0: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 20  e(pParse, pDup) 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  ){.          pTe
a900: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d  rm->eOperator |=
a910: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
a920: 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20       eExtraOp = 
a930: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a940: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a950: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
a960: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
a970: 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  New = pTerm;.   
a980: 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
a990: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 65 78 70 72  >wtFlags |= expr
a9a0: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
a9b0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4e 65  pDup);.      pNe
a9c0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
a9d0: 61 69 43 75 72 43 6f 6c 5b 30 5d 3b 0a 20 20 20  aiCurCol[0];.   
a9e0: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
a9f0: 6f 6c 75 6d 6e 20 3d 20 61 69 43 75 72 43 6f 6c  olumn = aiCurCol
aa00: 5b 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  [1];.      testc
aa10: 61 73 65 28 20 28 70 72 65 72 65 71 4c 65 66 74  ase( (prereqLeft
aa20: 20 7c 20 65 78 74 72 61 52 69 67 68 74 29 20 21   | extraRight) !
aa30: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a  = prereqLeft );.
aa40: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
aa50: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
aa60: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
aa70: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
aa80: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
aa90: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
aaa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f  ->eOperator = (o
aab0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
aac0: 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70  ->op) + eExtraOp
aad0: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
aae0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
aaf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab00: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
ab10: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
ab20: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
ab30: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
ab40: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
ab50: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
ab60: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
ab70: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
ab80: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f   implements.  Fo
ab90: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
aba0: 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57    **      a BETW
abb0: 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a  EEN b AND c.  **
abc0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
abd0: 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
abe0: 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45  **      (a BETWE
abf0: 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20  EN b AND c) AND 
ac00: 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63  (a>=b) AND (a<=c
ac10: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
ac20: 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72  two new terms ar
ac30: 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65  e added onto the
ac40: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72   end of the Wher
ac50: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a  eClause object..
ac60: 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72    ** The new ter
ac70: 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22  ms are "dynamic"
ac80: 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65   and are childre
ac90: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
aca0: 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74  l BETWEEN.  ** t
acb0: 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  erm.  That means
acc0: 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54   that if the BET
acd0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64  WEEN term is cod
ace0: 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e  ed, the children
acf0: 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65   are.  ** skippe
ad00: 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63  d.  Or, if the c
ad10: 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69  hildren are sati
ad20: 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65  sfied by an inde
ad30: 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  x, the original.
ad40: 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72    ** BETWEEN ter
ad50: 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  m is skipped..  
ad60: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
ad70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57  xpr->op==TK_BETW
ad80: 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d  EEN && pWC->op==
ad90: 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78  TK_AND ){.    Ex
ada0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
adb0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
adc0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
add0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
ade0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
adf0: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
ae00: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
ae10: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
ae20: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
ae30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
ae40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
ae50: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
ae60: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
ae70: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
ae80: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
ae90: 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20  se, ops[i], .   
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aec0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
aed0: 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20  pr->pLeft, 0),. 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
af00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
af10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
af20: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 72 61  , 0));.      tra
af30: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
af40: 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45 78 70  s(pNewExpr, pExp
af50: 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  r);.      idxNew
af60: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
af70: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
af80: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
af90: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
afa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
afb0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
afc0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
afd0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
afe0: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
aff0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b000: 5d 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  ];.      markTer
b010: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
b020: 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a  xNew, idxTerm);.
b030: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b040: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b050: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
b060: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
b070: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b080: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
b090: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
b0a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b0b0: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
b0c0: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
b0d0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
b0e0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
b0f0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
b100: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
b110: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
b120: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b130: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
b140: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
b150: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
b160: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
b170: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
b180: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
b190: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b1a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b1b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b1c0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b1d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b1e0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b1f0: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
b200: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
b210: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
b220: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
b230: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
b240: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
b250: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
b260: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
b270: 45 20 27 61 42 63 25 27 22 20 69 73 20 63 68 61  E 'aBc%'" is cha
b280: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
b290: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
b2a0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 41 42 43           x>='ABC
b2b0: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
b2c0: 44 20 78 20 4c 49 4b 45 20 27 61 42 63 25 27 0a  D x LIKE 'aBc%'.
b2d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
b2e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
b2f0: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
b300: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
b310: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
b320: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
b330: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 20 20 49  dition "abd".  I
b340: 66 20 63 61 73 65 20 69 73 20 6e 6f 74 20 73 69  f case is not si
b350: 67 6e 69 66 69 63 61 6e 74 20 28 74 68 65 20 64  gnificant (the d
b360: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 66 6f 72 20  efault.  ** for 
b370: 4c 49 4b 45 29 20 74 68 65 6e 20 74 68 65 20 6c  LIKE) then the l
b380: 6f 77 65 72 2d 62 6f 75 6e 64 20 69 73 20 6d 61  ower-bound is ma
b390: 64 65 20 61 6c 6c 20 75 70 70 65 72 63 61 73 65  de all uppercase
b3a0: 20 61 6e 64 20 74 68 65 20 75 70 70 65 72 2d 0a   and the upper-.
b3b0: 20 20 2a 2a 20 62 6f 75 6e 64 20 69 73 20 6d 61    ** bound is ma
b3c0: 64 65 20 61 6c 6c 20 6c 6f 77 65 72 63 61 73 65  de all lowercase
b3d0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
b3e0: 6e 64 73 20 61 6c 73 6f 20 77 6f 72 6b 20 77 68  nds also work wh
b3f0: 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 2a  en comparing.  *
b400: 2a 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f 0a 20 20  * BLOBs..  */.  
b410: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
b420: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
b430: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
b440: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
b450: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
b460: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
b470: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
b480: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
b490: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
b4a0: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
b4b0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
b4c0: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
b4d0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
b4e0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
b4f0: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
b500: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
b510: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
b520: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
b530: 77 32 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  w2;.    const ch
b540: 61 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65  ar *zCollSeqName
b550: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
b560: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b570: 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  nce */.    const
b580: 20 75 31 36 20 77 74 46 6c 61 67 73 20 3d 20 54   u16 wtFlags = T
b590: 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c 20 54 45  ERM_LIKEOPT | TE
b5a0: 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20 54 45 52  RM_VIRTUAL | TER
b5b0: 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 20 20 20  M_DYNAMIC;..    
b5c0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b5d0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b5e0: 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20  pr;.    pStr2 = 
b5f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b600: 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 0a 20  b, pStr1, 0);.. 
b610: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
b620: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 74 6f  e lower bound to
b630: 20 75 70 70 65 72 2d 63 61 73 65 20 61 6e 64 20   upper-case and 
b640: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
b650: 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 2d  to.    ** lower-
b660: 63 61 73 65 20 28 75 70 70 65 72 2d 63 61 73 65  case (upper-case
b670: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6c 6f   is less than lo
b680: 77 65 72 2d 63 61 73 65 20 69 6e 20 41 53 43 49  wer-case in ASCI
b690: 49 29 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a  I) so that.    *
b6a0: 2a 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  * the range cons
b6b0: 74 72 61 69 6e 74 73 20 61 6c 73 6f 20 77 6f 72  traints also wor
b6c0: 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20 20 20 20  k for BLOBs.    
b6d0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 43 61 73  */.    if( noCas
b6e0: 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64 62  e && !pParse->db
b6f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b700: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
b710: 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20       char c;.   
b720: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
b730: 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45 3b 0a  s |= TERM_LIKE;.
b740: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
b750: 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f  c = pStr1->u.zTo
b760: 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  ken[i])!=0; i++)
b770: 7b 0a 20 20 20 20 20 20 20 20 70 53 74 72 31 2d  {.        pStr1-
b780: 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73  >u.zToken[i] = s
b790: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 63 29  qlite3Toupper(c)
b7a0: 3b 0a 20 20 20 20 20 20 20 20 70 53 74 72 32 2d  ;.        pStr2-
b7b0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73  >u.zToken[i] = s
b7c0: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29  qlite3Tolower(c)
b7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b7e0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b7f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b800: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b810: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b820: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b830: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b840: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b850: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b860: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b870: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b880: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b890: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b8a0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b8b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b8c0: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b8d0: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b8e0: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b8f0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b900: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b910: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b920: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b930: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b940: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b950: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b960: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b970: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b980: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b990: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b9a0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b9b0: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b9c0: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b9d0: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b9e0: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b9f0: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
ba00: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
ba10: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
ba20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
ba30: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
ba40: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
ba50: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
ba60: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
ba70: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
ba80: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
ba90: 20 20 20 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 20     zCollSeqName 
baa0: 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  = noCase ? "NOCA
bab0: 53 45 22 20 3a 20 73 71 6c 69 74 65 33 53 74 72  SE" : sqlite3Str
bac0: 42 49 4e 41 52 59 3b 0a 20 20 20 20 70 4e 65 77  BINARY;.    pNew
bad0: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
bae0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
baf0: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
bb00: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
bb10: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
bb20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
bb30: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
bb40: 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
bb50: 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f 6c 6c 53  pNewExpr1,zCollS
bb60: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
bb70: 20 20 20 20 70 53 74 72 31 29 3b 0a 20 20 20 20      pStr1);.    
bb80: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
bb90: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20  ings(pNewExpr1, 
bba0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
bbb0: 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
bbc0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
bbd0: 77 45 78 70 72 31 2c 20 77 74 46 6c 61 67 73 29  wExpr1, wtFlags)
bbe0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bbf0: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
bc00: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bc10: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
bc20: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
bc30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bc40: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
bc50: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
bc60: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
bc70: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
bc80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bc90: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
bca0: 69 6e 67 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ing(pParse,pNewE
bcb0: 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d  xpr2,zCollSeqNam
bcc0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
bcd0: 53 74 72 32 29 3b 0a 20 20 20 20 74 72 61 6e 73  Str2);.    trans
bce0: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
bcf0: 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72  pNewExpr2, pExpr
bd00: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
bd10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bd20: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
bd30: 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20 20 20  2, wtFlags);.   
bd40: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
bd50: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
bd60: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
bd70: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
bd80: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
bd90: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
bda0: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
bdb0: 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d  {.      markTerm
bdc0: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
bdd0: 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a  New1, idxTerm);.
bde0: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
bdf0: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
be00: 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  w2, idxTerm);.  
be10: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
be20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
be30: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
be40: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
be50: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
be60: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
be70: 57 4f 5f 41 55 58 20 61 75 78 69 6c 69 61 72 79  WO_AUX auxiliary
be80: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
be90: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
bea0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
beb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
bec0: 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 75 6d   the form "colum
bed0: 6e 20 4f 50 20 65 78 70 72 22 20 77 68 65 72 65  n OP expr" where
bee0: 20 4f 50 0a 20 20 2a 2a 20 69 73 20 61 6e 20 6f   OP.  ** is an o
bef0: 70 65 72 61 74 6f 72 20 74 68 61 74 20 67 65 74  perator that get
bf00: 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 76 69  s passed into vi
bf10: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 62 75 74  rtual tables but
bf20: 20 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 6e   which is.  ** n
bf30: 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 6f 70 74 69  ot normally opti
bf40: 6d 69 7a 65 64 20 66 6f 72 20 6f 72 64 69 6e 61  mized for ordina
bf50: 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 20 6f  ry tables.  In o
bf60: 74 68 65 72 20 77 6f 72 64 73 2c 20 4f 50 0a 20  ther words, OP. 
bf70: 20 2a 2a 20 69 73 20 6f 6e 65 20 6f 66 20 4d 41   ** is one of MA
bf80: 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f 42 2c  TCH, LIKE, GLOB,
bf90: 20 52 45 47 45 58 50 2c 20 21 3d 2c 20 49 53 2c   REGEXP, !=, IS,
bfa0: 20 49 53 20 4e 4f 54 2c 20 6f 72 20 4e 4f 54 20   IS NOT, or NOT 
bfb0: 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 54 68 69 73 20  NULL..  ** This 
bfc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
bfd0: 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
bfe0: 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
bff0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
c000: 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
c010: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
c020: 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
c030: 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
c040: 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
c050: 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
c060: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
c070: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
c080: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 30 2c  xpr *pRight = 0,
c090: 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20   *pLeft = 0;.   
c0a0: 20 69 6e 74 20 72 65 73 20 3d 20 69 73 41 75 78   int res = isAux
c0b0: 69 6c 69 61 72 79 56 74 61 62 4f 70 65 72 61 74  iliaryVtabOperat
c0c0: 6f 72 28 64 62 2c 20 70 45 78 70 72 2c 20 26 65  or(db, pExpr, &e
c0d0: 4f 70 32 2c 20 26 70 4c 65 66 74 2c 20 26 70 52  Op2, &pLeft, &pR
c0e0: 69 67 68 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  ight);.    while
c0f0: 28 20 72 65 73 2d 2d 20 3e 20 30 20 29 7b 0a 20  ( res-- > 0 ){. 
c100: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
c110: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
c120: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
c130: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
c140: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
c150: 70 72 3b 0a 0a 20 20 20 20 20 20 70 72 65 72 65  pr;..      prere
c160: 71 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 57  qExpr = sqlite3W
c170: 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d  hereExprUsage(pM
c180: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
c190: 0a 20 20 20 20 20 20 70 72 65 72 65 71 43 6f 6c  .      prereqCol
c1a0: 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65  umn = sqlite3Whe
c1b0: 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73  reExprUsage(pMas
c1c0: 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
c1d0: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
c1e0: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
c1f0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
c200: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
c210: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78  ;.        pNewEx
c220: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
c230: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54  r(pParse, TK_MAT
c240: 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  CH, .           
c250: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
c260: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
c270: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
c280: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c290: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
c2a0: 69 6e 29 20 26 26 20 70 4e 65 77 45 78 70 72 20  in) && pNewExpr 
c2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
c2c0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
c2d0: 77 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  wExpr, EP_FromJo
c2e0: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
c2f0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
c300: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c310: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
c320: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c330: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
c340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
c350: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
c360: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c370: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c380: 20 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d          pNewTerm
c390: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
c3a0: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
c3b0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
c3c0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
c3d0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
c3e0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
c3f0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
c400: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
c410: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c420: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 55 58 3b  erator = WO_AUX;
c430: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 54 65 72  .        pNewTer
c440: 6d 2d 3e 65 4d 61 74 63 68 4f 70 20 3d 20 65 4f  m->eMatchOp = eO
c450: 70 32 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b  p2;.        mark
c460: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
c470: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
c480: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
c490: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c4a0: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
c4b0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c4c0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
c4d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c4e0: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c4f0: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c500: 20 20 7d 0a 20 20 20 20 20 20 53 57 41 50 28 45    }.      SWAP(E
c510: 78 70 72 2a 2c 20 70 4c 65 66 74 2c 20 70 52 69  xpr*, pLeft, pRi
c520: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
c530: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c540: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c550: 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  LE */..  /* If t
c560: 68 65 72 65 20 69 73 20 61 20 76 65 63 74 6f 72  here is a vector
c570: 20 3d 3d 20 6f 72 20 49 53 20 74 65 72 6d 20 2d   == or IS term -
c580: 20 65 2e 67 2e 20 22 28 61 2c 20 62 29 20 3d 3d   e.g. "(a, b) ==
c590: 20 28 3f 2c 20 3f 29 22 20 2d 20 63 72 65 61 74   (?, ?)" - creat
c5a0: 65 0a 20 20 2a 2a 20 6e 65 77 20 74 65 72 6d 73  e.  ** new terms
c5b0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6d 70 6f 6e   for each compon
c5c0: 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2d  ent comparison -
c5d0: 20 22 61 20 3d 20 3f 22 20 61 6e 64 20 22 62 20   "a = ?" and "b 
c5e0: 3d 20 3f 22 2e 20 20 54 68 65 0a 20 20 2a 2a 20  = ?".  The.  ** 
c5f0: 6e 65 77 20 74 65 72 6d 73 20 63 6f 6d 70 6c 65  new terms comple
c600: 74 65 6c 79 20 72 65 70 6c 61 63 65 20 74 68 65  tely replace the
c610: 20 6f 72 69 67 69 6e 61 6c 20 76 65 63 74 6f 72   original vector
c620: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 77 68 69   comparison, whi
c630: 63 68 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 6c 6f  ch is.  ** no lo
c640: 6e 67 65 72 20 75 73 65 64 2e 0a 20 20 2a 2a 0a  nger used..  **.
c650: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c    ** This is onl
c660: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 61 74  y required if at
c670: 20 6c 65 61 73 74 20 6f 6e 65 20 73 69 64 65 20   least one side 
c680: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
c690: 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a  n operation.  **
c6a0: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 2d 73 65   is not a sub-se
c6b0: 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lect.  */.  if( 
c6c0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
c6d0: 0a 20 20 26 26 20 28 70 45 78 70 72 2d 3e 6f 70  .  && (pExpr->op
c6e0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
c6f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 0a 20 20 26  ->op==TK_IS).  &
c700: 26 20 28 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74  & (nLeft = sqlit
c710: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
c720: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 3e  (pExpr->pLeft))>
c730: 31 0a 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  1.  && sqlite3Ex
c740: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c750: 70 72 2d 3e 70 52 69 67 68 74 29 3d 3d 6e 4c 65  pr->pRight)==nLe
c760: 66 74 0a 20 20 26 26 20 28 20 28 70 45 78 70 72  ft.  && ( (pExpr
c770: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
c780: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d   EP_xIsSelect)==
c790: 30 20 0a 20 20 20 20 7c 7c 20 28 70 45 78 70 72  0 .    || (pExpr
c7a0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
c7b0: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3d  & EP_xIsSelect)=
c7c0: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  =0).  ){.    int
c7d0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
c7e0: 20 69 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a   i<nLeft; i++){.
c7f0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
c800: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
c810: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
c820: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
c830: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
c840: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  d(pParse, pExpr-
c850: 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
c860: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
c870: 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56   sqlite3ExprForV
c880: 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73  ectorField(pPars
c890: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
c8a0: 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 70 4e 65  , i);..      pNe
c8b0: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
c8c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c8d0: 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  op, pLeft, pRigh
c8e0: 74 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66  t);.      transf
c8f0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
c900: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
c910: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c920: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c930: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 44 59  C, pNew, TERM_DY
c940: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78  NAMIC);.      ex
c950: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
c960: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
c970: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 20 3d 20    }.    pTerm = 
c980: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c990: 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
c9a0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
c9b0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 3b  ED|TERM_VIRTUAL;
c9c0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
c9d0: 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 20   original */.   
c9e0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
c9f0: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r = 0;.  }..  /*
ca00: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 76   If there is a v
ca10: 65 63 74 6f 72 20 49 4e 20 74 65 72 6d 20 2d 20  ector IN term - 
ca20: 65 2e 67 2e 20 22 28 61 2c 20 62 29 20 49 4e 20  e.g. "(a, b) IN 
ca30: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 2d 20  (SELECT ...)" - 
ca40: 63 72 65 61 74 65 0a 20 20 2a 2a 20 61 20 76 69  create.  ** a vi
ca50: 72 74 75 61 6c 20 74 65 72 6d 20 66 6f 72 20 65  rtual term for e
ca60: 61 63 68 20 76 65 63 74 6f 72 20 63 6f 6d 70 6f  ach vector compo
ca70: 6e 65 6e 74 2e 20 54 68 65 20 65 78 70 72 65 73  nent. The expres
ca80: 73 69 6f 6e 20 6f 62 6a 65 63 74 0a 20 20 2a 2a  sion object.  **
ca90: 20 75 73 65 64 20 62 79 20 65 61 63 68 20 73 75   used by each su
caa0: 63 68 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ch virtual term 
cab0: 69 73 20 70 45 78 70 72 20 28 74 68 65 20 66 75  is pExpr (the fu
cac0: 6c 6c 20 76 65 63 74 6f 72 20 49 4e 28 2e 2e 2e  ll vector IN(...
cad0: 29 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  ) .  ** expressi
cae0: 6f 6e 29 2e 20 54 68 65 20 57 68 65 72 65 54 65  on). The WhereTe
caf0: 72 6d 2e 69 46 69 65 6c 64 20 76 61 72 69 61 62  rm.iField variab
cb00: 6c 65 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  le identifies th
cb10: 65 20 69 6e 64 65 78 20 77 69 74 68 69 6e 0a 20  e index within. 
cb20: 20 2a 2a 20 74 68 65 20 76 65 63 74 6f 72 20 6f   ** the vector o
cb30: 6e 20 74 68 65 20 4c 48 53 20 74 68 61 74 20 74  n the LHS that t
cb40: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
cb50: 72 65 70 72 65 73 65 6e 74 73 2e 0a 20 20 2a 2a  represents..  **
cb60: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20  .  ** This only 
cb70: 77 6f 72 6b 73 20 69 66 20 74 68 65 20 52 48 53  works if the RHS
cb80: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 45 4c   is a simple SEL
cb90: 45 43 54 2c 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  ECT, not a compo
cba0: 75 6e 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  und.  */.  if( p
cbb0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26  WC->op==TK_AND &
cbc0: 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
cbd0: 49 4e 20 26 26 20 70 54 65 72 6d 2d 3e 69 46 69  IN && pTerm->iFi
cbe0: 65 6c 64 3d 3d 30 0a 20 20 20 26 26 20 70 45 78  eld==0.   && pEx
cbf0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
cc00: 4b 5f 56 45 43 54 4f 52 0a 20 20 20 26 26 20 70  K_VECTOR.   && p
cc10: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
cc20: 3e 70 50 72 69 6f 72 3d 3d 30 0a 20 20 29 7b 0a  >pPrior==0.  ){.
cc30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
cc40: 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65  or(i=0; i<sqlite
cc50: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
cc60: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 20 69  pExpr->pLeft); i
cc70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
cc80: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 69 64 78  dxNew;.      idx
cc90: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
cca0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
ccb0: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
ccc0: 29 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  );.      pWC->a[
ccd0: 69 64 78 4e 65 77 5d 2e 69 46 69 65 6c 64 20 3d  idxNew].iField =
cce0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 65 78 70 72   i+1;.      expr
ccf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
cd00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
cd10: 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c    markTermAsChil
cd20: 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69  d(pWC, idxNew, i
cd30: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20  dxTerm);.    }. 
cd40: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
cd50: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
cd60: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
cd70: 73 74 61 74 34 20 68 69 73 74 6f 67 72 61 6d 20  stat4 histogram 
cd80: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
cd90: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
cda0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
cdb0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
cdc0: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
cdd0: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
cde0: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
cdf0: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
ce00: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
ce10: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
ce20: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
ce30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
ce40: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
ce50: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
ce60: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
ce70: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
ce80: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
ce90: 55 4c 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ULL..  */.  if( 
cea0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
ceb0: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
cec0: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
ced0: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
cee0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
cef0: 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20 21 45 78  umn>=0.   && !Ex
cf00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
cf10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
cf20: 29 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  ).   && Optimiza
cf30: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
cf40: 53 51 4c 49 54 45 5f 53 74 61 74 34 29 0a 20 20  SQLITE_Stat4).  
cf50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
cf60: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
cf70: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
cf80: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
cf90: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
cfa0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
cfb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
cfc0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
cfd0: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d000: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
d010: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
d040: 6f 63 28 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  oc(db, TK_NULL, 
d050: 30 2c 20 30 29 29 3b 0a 0a 20 20 20 20 69 64 78  0, 0));..    idx
d060: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
d070: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d080: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
d0b0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
d0c0: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
d0d0: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
d0e0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
d0f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
d100: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d110: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
d120: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d130: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
d140: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
d150: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
d160: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
d170: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
d180: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
d190: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
d1a0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
d1b0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
d1c0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
d1d0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
d1e0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
d1f0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
d200: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
d210: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d220: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
d230: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
d240: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
d250: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
d260: 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20  _STAT4 */..  /* 
d270: 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73  Prevent ON claus
d280: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46  e terms of a LEF
d290: 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e  T JOIN from bein
d2a0: 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a  g used to drive.
d2b0: 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f    ** an index fo
d2c0: 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
d2d0: 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
d2e0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
d2f0: 65 28 20 70 54 65 72 6d 21 3d 26 70 57 43 2d 3e  e( pTerm!=&pWC->
d300: 61 5b 69 64 78 54 65 72 6d 5d 20 29 3b 0a 20 20  a[idxTerm] );.  
d310: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
d320: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 54 65 72  idxTerm];.  pTer
d330: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
d340: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
d350: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
d360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
d3a0: 20 52 6f 75 74 69 6e 65 73 20 77 69 74 68 20 66   Routines with f
d3b0: 69 6c 65 20 73 63 6f 70 65 20 61 62 6f 76 65 2e  ile scope above.
d3c0: 20 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74    Interface to t
d3d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 77  he rest of the w
d3e0: 68 65 72 65 2e 63 0a 2a 2a 20 73 75 62 73 79 73  here.c.** subsys
d3f0: 74 65 6d 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 2a  tem follows..***
d400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d440: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
d450: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
d460: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
d470: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
d480: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
d490: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
d4a0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
d4b0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
d4c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
d4d0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
d4e0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
d4f0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
d500: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
d510: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
d520: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
d530: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
d540: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
d550: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
d560: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
d570: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
d580: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
d590: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
d5a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
d5b0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
d5c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
d5d0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
d5e0: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
d5f0: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
d600: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
d620: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
d630: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
d640: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
d650: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
d660: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
d670: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
d680: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
d690: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
d6a0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
d6b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
d6c0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
d6d0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
d6e0: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
d6f0: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
d700: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
d710: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
d720: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
d730: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
d740: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
d750: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
d760: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
d770: 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 57 68  te3WhereSplit(Wh
d780: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
d790: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38 20  Expr *pExpr, u8 
d7a0: 6f 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 32  op){.  Expr *pE2
d7b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
d7c0: 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65  ipCollateAndLike
d7d0: 6c 79 28 70 45 78 70 72 29 3b 0a 20 20 70 57 43  ly(pExpr);.  pWC
d7e0: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28  ->op = op;.  if(
d7f0: 20 70 45 32 3d 3d 30 20 29 20 72 65 74 75 72 6e   pE2==0 ) return
d800: 3b 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 21  ;.  if( pE2->op!
d810: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
d820: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
d830: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
d840: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d850: 33 57 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c  3WhereSplit(pWC,
d860: 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 6f 70 29   pE2->pLeft, op)
d870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  ;.    sqlite3Whe
d880: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 32  reSplit(pWC, pE2
d890: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
d8a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d8b0: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
d8c0: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
d8d0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
d8e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
d8f0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
d900: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
d910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
d920: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
d930: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
d940: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
d950: 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68  nfo        /* Th
d960: 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69  e WHERE processi
d970: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
d980: 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d  .  pWC->pWInfo =
d990: 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e   pWInfo;.  pWC->
d9a0: 68 61 73 4f 72 20 3d 20 30 3b 0a 20 20 70 57 43  hasOr = 0;.  pWC
d9b0: 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20  ->pOuter = 0;.  
d9c0: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
d9d0: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
d9e0: 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53  rraySize(pWC->aS
d9f0: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
da00: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
da10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
da20: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
da30: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
da40: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
da50: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
da60: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
da70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
da80: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
da90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
daa0: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
dab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
dac0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
dad0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
dae0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
daf0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69  eTerm *a;.  sqli
db00: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
db10: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
db20: 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  b;.  for(i=pWC->
db30: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
db40: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
db50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77  +){.    if( a->w
db60: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
db70: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
db80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
db90: 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a  (db, a->pExpr);.
dba0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d      }.    if( a-
dbb0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
dbc0: 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  ORINFO ){.      
dbd0: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
dbe0: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e  e(db, a->u.pOrIn
dbf0: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
dc00: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
dc10: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a  TERM_ANDINFO ){.
dc20: 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e        whereAndIn
dc30: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
dc40: 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20  u.pAndInfo);.   
dc50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43   }.  }.  if( pWC
dc60: 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  ->a!=pWC->aStati
dc70: 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
dc80: 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e  DbFree(db, pWC->
dc90: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  a);.  }.}.../*.*
dca0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
dcb0: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
dcc0: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
dcd0: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
dce0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
dcf0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
dd00: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
dd10: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
dd20: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
dd30: 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33  .Bitmask sqlite3
dd40: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 4e 4e  WhereExprUsageNN
dd50: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
dd60: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
dd70: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
dd80: 6b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  k;.  if( p->op==
dd90: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 21 45 78  TK_COLUMN && !Ex
dda0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
ddb0: 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 7b   EP_FixedCol) ){
ddc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
ddd0: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
dde0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61  pMaskSet, p->iTa
ddf0: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ble);.  }else if
de00: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
de10: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
de20: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
de30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
de40: 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
de50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
de60: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 28 70  .  }.  mask = (p
de70: 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c  ->op==TK_IF_NULL
de80: 5f 52 4f 57 29 20 3f 20 73 71 6c 69 74 65 33 57  _ROW) ? sqlite3W
de90: 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73  hereGetMask(pMas
dea0: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
deb0: 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   : 0;.  if( p->p
dec0: 4c 65 66 74 20 29 20 6d 61 73 6b 20 7c 3d 20 73  Left ) mask |= s
ded0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
dee0: 73 61 67 65 4e 4e 28 70 4d 61 73 6b 53 65 74 2c  sageNN(pMaskSet,
def0: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
df00: 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
df10: 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74     mask |= sqlit
df20: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
df30: 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  NN(pMaskSet, p->
df40: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 61 73 73  pRight);.    ass
df50: 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d  ert( p->x.pList=
df60: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
df70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
df80: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
df90: 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  t) ){.    if( Ex
dfa0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
dfb0: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
dfc0: 20 70 4d 61 73 6b 53 65 74 2d 3e 62 56 61 72 53   pMaskSet->bVarS
dfd0: 65 6c 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 6d  elect = 1;.    m
dfe0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
dff0: 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
e000: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
e010: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78    }else if( p->x
e020: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 6d 61  .pList ){.    ma
e030: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  sk |= sqlite3Whe
e040: 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
e050: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
e060: 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  List);.  }.#ifnd
e070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
e080: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
e090: 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
e0a0: 4f 4e 20 26 26 20 70 2d 3e 79 2e 70 57 69 6e 20  ON && p->y.pWin 
e0b0: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73  ){.    mask |= s
e0c0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
e0d0: 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
e0e0: 74 2c 20 70 2d 3e 79 2e 70 57 69 6e 2d 3e 70 50  t, p->y.pWin->pP
e0f0: 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 6d  artition);.    m
e100: 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  ask |= sqlite3Wh
e110: 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
e120: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 79 2e  (pMaskSet, p->y.
e130: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b  pWin->pOrderBy);
e140: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
e150: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 42 69 74  turn mask;.}.Bit
e160: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
e170: 65 45 78 70 72 55 73 61 67 65 28 57 68 65 72 65  eExprUsage(Where
e180: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
e190: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  t, Expr *p){.  r
e1a0: 65 74 75 72 6e 20 70 20 3f 20 73 71 6c 69 74 65  eturn p ? sqlite
e1b0: 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 4e  3WhereExprUsageN
e1c0: 4e 28 70 4d 61 73 6b 53 65 74 2c 70 29 20 3a 20  N(pMaskSet,p) : 
e1d0: 30 3b 0a 7d 0a 42 69 74 6d 61 73 6b 20 73 71 6c  0;.}.Bitmask sql
e1e0: 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
e1f0: 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  tUsage(WhereMask
e200: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
e210: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d  .  int i;.  Bitm
e230: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
e240: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
e250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e260: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e270: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71        mask |= sq
e280: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
e290: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
e2a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
e2b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e2c0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 0a 2f  turn mask;.}.../
e2d0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
e2e0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
e2f0: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
e300: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ause.  .**.** No
e310: 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
e320: 79 7a 65 28 29 20 6d 69 67 68 74 20 61 64 64 20  yze() might add 
e330: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
e340: 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  s onto the.** en
e350: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
e360: 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f  lause.  We do no
e370: 74 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  t want to analyz
e380: 65 20 74 68 65 73 65 20 6e 65 77 0a 2a 2a 20 76  e these new.** v
e390: 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
e3a0: 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
e3b0: 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e 64 20   at the end and 
e3c0: 77 6f 72 6b 20 66 6f 72 77 61 72 64 0a 2a 2a 20  work forward.** 
e3d0: 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65  so that the adde
e3e0: 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  d virtual terms 
e3f0: 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73  are never proces
e400: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
e410: 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61  ite3WhereExprAna
e420: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
e430: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
e440: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e450: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e460: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
e470: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
e480: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
e490: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
e4a0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
e4b0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
e4c0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
e4d0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
e4e0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
e4f0: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65 2d  /*.** For table-
e500: 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 73  valued-functions
e510: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  , transform the 
e520: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
e530: 74 73 20 69 6e 74 6f 0a 2a 2a 20 6e 65 77 20 57  ts into.** new W
e540: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
e550: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  s.  .**.** Each 
e560: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
e570: 74 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e 74  t translates int
e580: 6f 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  o an equality co
e590: 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 74  nstraint against
e5a0: 0a 2a 2a 20 61 20 48 49 44 44 45 4e 20 63 6f 6c  .** a HIDDEN col
e5b0: 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
e5c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e5d0: 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72 67  3WhereTabFuncArg
e5e0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
e5f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
e600: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e610: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
e620: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
e630: 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 20  em *pItem,      
e640: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
e650: 75 73 65 20 74 65 72 6d 20 74 6f 20 70 72 6f 63  use term to proc
e660: 65 73 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ess */.  WhereCl
e670: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
e680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 66             /* Xf
e690: 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  er function argu
e6a0: 6d 65 6e 74 73 20 74 6f 20 68 65 72 65 20 2a 2f  ments to here */
e6b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
e6c0: 62 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  b;.  int j, k;. 
e6d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 73   ExprList *pArgs
e6e0: 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c 52 65  ;.  Expr *pColRe
e6f0: 66 3b 0a 20 20 45 78 70 72 20 2a 70 54 65 72 6d  f;.  Expr *pTerm
e700: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
e710: 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
e720: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 20   return;.  pTab 
e730: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
e740: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
e750: 20 29 3b 0a 20 20 70 41 72 67 73 20 3d 20 70 49   );.  pArgs = pI
e760: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
e770: 3b 0a 20 20 69 66 28 20 70 41 72 67 73 3d 3d 30  ;.  if( pArgs==0
e780: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e790: 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41 72 67 73 2d  (j=k=0; j<pArgs-
e7a0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
e7b0: 20 20 45 78 70 72 20 2a 70 52 68 73 3b 0a 20 20    Expr *pRhs;.  
e7c0: 20 20 77 68 69 6c 65 28 20 6b 3c 70 54 61 62 2d    while( k<pTab-
e7d0: 3e 6e 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  >nCol && (pTab->
e7e0: 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46 6c 61 67 73  aCol[k].colFlags
e7f0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
e800: 4e 29 3d 3d 30 20 29 7b 6b 2b 2b 3b 7d 0a 20 20  N)==0 ){k++;}.  
e810: 20 20 69 66 28 20 6b 3e 3d 70 54 61 62 2d 3e 6e    if( k>=pTab->n
e820: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
e830: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e840: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
e850: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 28 29  rguments on %s()
e860: 20 2d 20 6d 61 78 20 25 64 22 2c 0a 20 20 20 20   - max %d",.    
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6a    pTab->zName, j
e890: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
e8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 52  .    }.    pColR
e8b0: 65 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ef = sqlite3Expr
e8c0: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
e8d0: 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  , TK_COLUMN, 0, 
e8e0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
e8f0: 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Ref==0 ) return;
e900: 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e 69 54  .    pColRef->iT
e910: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
e920: 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f 6c 52  ursor;.    pColR
e930: 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6b 2b  ef->iColumn = k+
e940: 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e  +;.    pColRef->
e950: 79 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  y.pTab = pTab;. 
e960: 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
e970: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
e980: 4b 5f 55 50 4c 55 53 2c 20 0a 20 20 20 20 20 20  K_UPLUS, .      
e990: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
e9a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 72  (pParse->db, pAr
e9b0: 67 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  gs->a[j].pExpr, 
e9c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 70 54 65 72  0), 0);.    pTer
e9d0: 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
e9e0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
e9f0: 70 43 6f 6c 52 65 66 2c 20 70 52 68 73 29 3b 0a  pColRef, pRhs);.
ea00: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
ea10: 6e 73 65 72 74 28 70 57 43 2c 20 70 54 65 72 6d  nsert(pWC, pTerm
ea20: 2c 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  , TERM_DYNAMIC);
ea30: 0a 20 20 7d 0a 7d 0a                             .  }.}.