/ Hex Artifact Content
Login

Artifact 22dbfd3bf5f6051a61523dd0ebef7a944fb29ee4aa7d2a62feb8aac6ffbbc0eb:


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 28 70 29 3b  rSkipCollate(p);
0be0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
0bf0: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
0c00: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
0c10: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
0c20: 74 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73 65 74  t = -1;.  memset
0c30: 28 26 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  (&pTerm->eOperat
0c40: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
0c50: 73 69 7a 65 6f 66 28 57 68 65 72 65 54 65 72 6d  sizeof(WhereTerm
0c60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65  ) - offsetof(Whe
0c70: 72 65 54 65 72 6d 2c 65 4f 70 65 72 61 74 6f 72  reTerm,eOperator
0c80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  ));.  return idx
0c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0ca0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
0cb0: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
0cc0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
0cd0: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
0ce0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
0cf0: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
0d00: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
0d10: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
0d20: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
0d30: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
0d40: 3e 3d 22 2c 20 22 49 4e 22 2c 20 22 49 53 22 2c  >=", "IN", "IS",
0d50: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
0d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
0d70: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
0d80: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
0d90: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
0da0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
0db0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
0dc0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
0dd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
0de0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
0df0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
0e00: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
0e10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
0e20: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
0e30: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
0e40: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
0e50: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  ULL || op==TK_IS
0e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  ;.}../*.** Commu
0e70: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
0e80: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
0e90: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
0ea0: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
0eb0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
0ec0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
0ed0: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
0ee0: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
0ef0: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
0f00: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
0f10: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
0f20: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
0f30: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0f40: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
0f50: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
0f60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
0f70: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
0f80: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
0f90: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
0fa0: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
0fb0: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
0fc0: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
0fd0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fe0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
0ff0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
1000: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
1010: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
1020: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
1030: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1040: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
1050: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
1060: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
1070: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
1080: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1090: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
10a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
10b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
10c0: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
10d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
10e0: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
10f0: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
1100: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
1110: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1120: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
1130: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
1140: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
1150: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
1160: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
1170: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
1180: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
1190: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
11a0: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
11b0: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
11c0: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
11d0: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
11e0: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
11f0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
1200: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
1210: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
1220: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
1230: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
1240: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
1250: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
1260: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
1270: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
1280: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1290: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
12b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
12c0: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
12d0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
12e0: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
12f0: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
1300: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
1310: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
1320: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
1330: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
1340: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
1350: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
1360: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
1370: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
1380: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
1390: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
13a0: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
13b0: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
13c0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
13d0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
13e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
13f0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
1400: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1410: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
1420: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
1430: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
1440: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
1450: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1460: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
1470: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
1480: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
1490: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
14a0: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
14b0: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
14c0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
14d0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
14e0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
14f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
1500: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
1510: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
1520: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
1530: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
1540: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
1550: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
1560: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
1570: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
1580: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
1590: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
15a0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
15b0: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
15c0: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
15d0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
15e0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
15f0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
1600: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
1610: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
1620: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
1630: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
1640: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
1650: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
1660: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
1670: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
1680: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
1690: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
16a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
16b0: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
16c0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
16d0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
16e0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
16f0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
1700: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 61 73 73  ==WO_GE );.  ass
1710: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 20 7c  ert( op!=TK_IS |
1720: 7c 20 63 3d 3d 57 4f 5f 49 53 20 29 3b 0a 20 20  | c==WO_IS );.  
1730: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 0a 23 69  return c;.}...#i
1740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1750: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
1760: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
1770: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
1780: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
1790: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
17a0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
17b0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
17c0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
17d0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
17e0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
17f0: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
1800: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
1810: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
1820: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
1830: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
1840: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
1850: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
1860: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
1870: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
1880: 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
1890: 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f  LHS must be a co
18a0: 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79  lumn.** that may
18b0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61   only be NULL, a
18c0: 20 73 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c   string, or a BL
18d0: 4f 42 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62  OB, never a numb
18e0: 65 72 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a  er. (This means.
18f0: 2a 2a 20 74 68 61 74 20 76 69 72 74 75 61 6c 20  ** that virtual 
1900: 74 61 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61  tables cannot pa
1910: 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
1920: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
1930: 6f 6e 2e 29 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  on.)  The.** col
1940: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1950: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  for the column o
1960: 6e 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  n the LHS must b
1970: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
1980: 72 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 6f  r.** the operato
1990: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19a0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
19b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
19d0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
19e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a00: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
1a10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78  pression */.  Ex
1a20: 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20  pr **ppPrefix,  
1a30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b  /* Pointer to TK
1a40: 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69  _STRING expressi
1a50: 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20  on with pattern 
1a60: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
1a70: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a  *pisComplete, /*
1a80: 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c   True if the onl
1a90: 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20  y wildcard is % 
1aa0: 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  in the last char
1ab0: 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  acter */.  int *
1ac0: 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20  pnoCase      /* 
1ad0: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73  True if uppercas
1ae0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
1af0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
1b00: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ){.  const u8 *z
1b10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1b20: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
1b30: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
1b40: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
1b50: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
1b60: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
1b70: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
1b80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
1b90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1bb0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
1bc0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
1bd0: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
1c00: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
1c10: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
1c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c30: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
1c40: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
1c50: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
1c60: 63 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[4];           
1c70: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
1c80: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
1c90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ca0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
1cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1cc0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
1cd0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
1ce0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
1d10: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1d40: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1d50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
1d60: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
1d70: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20  pExpr, pnoCase, 
1d80: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
1d90: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  n 0;.  }.#ifdef 
1da0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20  SQLITE_EBCDIC.  
1db0: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72  if( *pnoCase ) r
1dc0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
1dd0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
1de0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66  >x.pList;.  pLef
1df0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  t = pList->a[1].
1e00: 70 45 78 70 72 3b 0a 0a 20 20 70 52 69 67 68 74  pExpr;..  pRight
1e10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1e20: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
1e30: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
1e40: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
1e50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
1e60: 52 49 41 42 4c 45 20 26 26 20 28 64 62 2d 3e 66  RIABLE && (db->f
1e70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
1e80: 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 7b 0a  ableQPSG)==0 ){.
1e90: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
1ea0: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
1eb0: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
1ec0: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
1ed0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
1ee0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
1ef0: 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70  eGetBoundValue(p
1f00: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
1f10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
1f20: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
1f30: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
1f40: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
1f50: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
1f60: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
1f70: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
1f80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f90: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
1fa0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
1fb0: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
1fc0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
1fd0: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
1fe0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
1ff0: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
2000: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
2010: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 75 38  G ){.    z = (u8
2020: 2a 29 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  *)pRight->u.zTok
2030: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
2040: 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ){..    /* If th
2050: 65 20 52 48 53 20 62 65 67 69 6e 73 20 77 69 74  e RHS begins wit
2060: 68 20 61 20 64 69 67 69 74 20 6f 72 20 61 20 6d  h a digit or a m
2070: 69 6e 75 73 20 73 69 67 6e 2c 20 74 68 65 6e 20  inus sign, then 
2080: 74 68 65 20 4c 48 53 20 6d 75 73 74 0a 20 20 20  the LHS must.   
2090: 20 2a 2a 20 62 65 20 61 6e 20 6f 72 64 69 6e 61   ** be an ordina
20a0: 72 79 20 63 6f 6c 75 6d 6e 20 28 6e 6f 74 20 61  ry column (not a
20b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
20c0: 6f 6c 75 6d 6e 29 20 77 69 74 68 20 54 45 58 54  olumn) with TEXT
20d0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
20e0: 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  * Otherwise the 
20f0: 4c 48 53 20 6d 69 67 68 74 20 62 65 20 6e 75 6d  LHS might be num
2100: 65 72 69 63 20 61 6e 64 20 22 6c 68 73 20 3e 3d  eric and "lhs >=
2110: 20 72 68 73 22 20 77 6f 75 6c 64 20 62 65 20 66   rhs" would be f
2120: 61 6c 73 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e  alse.    ** even
2130: 20 74 68 6f 75 67 68 20 22 6c 68 73 20 4c 49 4b   though "lhs LIK
2140: 45 20 72 68 73 22 20 69 73 20 74 72 75 65 2e 20  E rhs" is true. 
2150: 20 42 75 74 20 69 66 20 74 68 65 20 52 48 53 20   But if the RHS 
2160: 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 0a 20  does not start. 
2170: 20 20 20 2a 2a 20 77 69 74 68 20 61 20 64 69 67     ** with a dig
2180: 69 74 20 6f 72 20 27 2d 27 2c 20 74 68 65 6e 20  it or '-', then 
2190: 22 6c 68 73 20 4c 49 4b 45 20 72 68 73 22 20 77  "lhs LIKE rhs" w
21a0: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 66 61  ill always be fa
21b0: 6c 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lse if.    ** th
21c0: 65 20 4c 48 53 20 69 73 20 6e 75 6d 65 72 69 63  e LHS is numeric
21d0: 20 61 6e 64 20 73 6f 20 74 68 65 20 6f 70 74 69   and so the opti
21e0: 6d 69 7a 61 74 69 6f 6e 20 73 74 69 6c 6c 20 77  mization still w
21f0: 6f 72 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  orks..    */.   
2200: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
2210: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 7a 5b 30  git(z[0]) || z[0
2220: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
2230: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
2240: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 20  K_COLUMN .      
2250: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
2260: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
2270: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
2280: 0a 20 20 20 20 20 20 20 7c 7c 20 49 73 56 69 72  .       || IsVir
2290: 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62  tual(pLeft->pTab
22a0: 29 20 20 2f 2a 20 56 61 6c 75 65 20 6d 69 67 68  )  /* Value migh
22b0: 74 20 62 65 20 6e 75 6d 65 72 69 63 20 2a 2f 0a  t be numeric */.
22c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22d0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
22e0: 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  e(pVal);.       
22f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2300: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2310: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
2320: 72 20 6f 66 20 70 72 65 66 69 78 20 63 68 61 72  r of prefix char
2330: 61 63 74 65 72 73 20 70 72 69 6f 72 20 74 6f 20  acters prior to 
2340: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
2350: 72 64 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20  rd */.    cnt = 
2360: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
2370: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
2380: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
2390: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
23a0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
23b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 77 63 5b        if( c==wc[
23c0: 33 5d 20 26 26 20 7a 5b 63 6e 74 5d 21 3d 30 20  3] && z[cnt]!=0 
23d0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  ) cnt++;.    }..
23e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
23f0: 69 7a 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ization is possi
2400: 62 6c 65 20 6f 6e 6c 79 20 69 66 20 28 31 29 20  ble only if (1) 
2410: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73  the pattern does
2420: 20 6e 6f 74 20 62 65 67 69 6e 0a 20 20 20 20 2a   not begin.    *
2430: 2a 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  * with a wildcar
2440: 64 20 61 6e 64 20 69 66 20 28 32 29 20 74 68 65  d and if (2) the
2450: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
2460: 65 66 69 78 20 64 6f 65 73 20 6e 6f 74 20 65 6e  efix does not en
2470: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e  d with.    ** an
2480: 20 28 69 6c 6c 65 67 61 6c 20 30 78 66 66 29 20   (illegal 0xff) 
2490: 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 65 20  character.  The 
24a0: 73 65 63 6f 6e 64 20 63 6f 6e 64 69 74 69 6f 6e  second condition
24b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
24c0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20  .    ** that we 
24d0: 63 61 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  can increment th
24e0: 65 20 70 72 65 66 69 78 20 6b 65 79 20 74 6f 20  e prefix key to 
24f0: 66 69 6e 64 20 61 6e 20 75 70 70 65 72 20 62 6f  find an upper bo
2500: 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 20 20  und for the.    
2510: 2a 2a 20 72 61 6e 67 65 20 73 65 61 72 63 68 2e  ** range search.
2520: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
2530: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
2540: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
2550: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
2560: 66 69 78 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  fix;..      /* A
2570: 20 22 63 6f 6d 70 6c 65 74 65 22 20 6d 61 74 63   "complete" matc
2580: 68 20 69 66 20 74 68 65 20 70 61 74 74 65 72 6e  h if the pattern
2590: 20 65 6e 64 73 20 77 69 74 68 20 22 2a 22 20 6f   ends with "*" o
25a0: 72 20 22 25 22 20 2a 2f 0a 20 20 20 20 20 20 2a  r "%" */.      *
25b0: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
25c0: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
25d0: 31 5d 3d 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  1]==0;..      /*
25e0: 20 47 65 74 20 74 68 65 20 70 61 74 74 65 72 6e   Get the pattern
25f0: 20 70 72 65 66 69 78 2e 20 20 52 65 6d 6f 76 65   prefix.  Remove
2600: 20 61 6c 6c 20 65 73 63 61 70 65 73 20 66 72 6f   all escapes fro
2610: 6d 20 74 68 65 20 70 72 65 66 69 78 2e 20 2a 2f  m the prefix. */
2620: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
2630: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2640: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 28 63 68 61   TK_STRING, (cha
2650: 72 2a 29 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  r*)z);.      if(
2660: 20 70 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20   pPrefix ){.    
2670: 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69      int iFrom, i
2680: 54 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  To;.        char
2690: 20 2a 7a 4e 65 77 20 3d 20 70 50 72 65 66 69 78   *zNew = pPrefix
26a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
26b0: 20 20 20 20 7a 4e 65 77 5b 63 6e 74 5d 20 3d 20      zNew[cnt] = 
26c0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
26d0: 46 72 6f 6d 3d 69 54 6f 3d 30 3b 20 69 46 72 6f  From=iTo=0; iFro
26e0: 6d 3c 63 6e 74 3b 20 69 46 72 6f 6d 2b 2b 29 7b  m<cnt; iFrom++){
26f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2700: 4e 65 77 5b 69 46 72 6f 6d 5d 3d 3d 77 63 5b 33  New[iFrom]==wc[3
2710: 5d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20  ] ) iFrom++;.   
2720: 20 20 20 20 20 20 20 7a 4e 65 77 5b 69 54 6f 2b         zNew[iTo+
2730: 2b 5d 20 3d 20 7a 4e 65 77 5b 69 46 72 6f 6d 5d  +] = zNew[iFrom]
2740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2750: 20 20 20 20 7a 4e 65 77 5b 69 54 6f 5d 20 3d 20      zNew[iTo] = 
2760: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2770: 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72   *ppPrefix = pPr
2780: 65 66 69 78 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  efix;..      /* 
2790: 49 66 20 74 68 65 20 52 48 53 20 70 61 74 74 65  If the RHS patte
27a0: 72 6e 20 69 73 20 61 20 62 6f 75 6e 64 20 70 61  rn is a bound pa
27b0: 72 61 6d 65 74 65 72 2c 20 6d 61 6b 65 20 61 72  rameter, make ar
27c0: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 0a 20 20  rangements to.  
27d0: 20 20 20 20 2a 2a 20 72 65 70 72 65 70 61 72 65      ** reprepare
27e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   the statement w
27f0: 68 65 6e 20 74 68 61 74 20 70 61 72 61 6d 65 74  hen that paramet
2800: 65 72 20 69 73 20 72 65 62 6f 75 6e 64 20 2a 2f  er is rebound */
2810: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
2820: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
2830: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
2840: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2860: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
2870: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
2880: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
2890: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
28a0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
28b0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
28c0: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
28d0: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
28e0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
28f0: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
2900: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
2910: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
2920: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
2930: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2940: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
2950: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
2960: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
2970: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
2980: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
2990: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
29a0: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
29b0: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
29c0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
29d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
29e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
29f0: 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  I. To work aroun
2a00: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
2a10: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
2a20: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
2a30: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
2a40: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
2a50: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2a70: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
2a80: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
2a90: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
2aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2ab0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
2ac0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2ad0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
2ae0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2af0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2b00: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
2b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b20: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
2b30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
2b40: 3d 20 28 7a 21 3d 30 29 3b 0a 20 20 73 71 6c 69  = (z!=0);.  sqli
2b50: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
2b60: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2b70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2b80: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
2b90: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
2ba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2bb0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2bc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
2bd0: 73 65 65 20 69 66 20 74 68 65 20 70 45 78 70 72  see if the pExpr
2be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
2bf0: 20 66 6f 72 6d 20 74 68 61 74 20 6e 65 65 64 73   form that needs
2c00: 20 74 6f 20 62 65 20 70 61 73 73 65 64 0a 2a 2a   to be passed.**
2c10: 20 74 6f 20 74 68 65 20 78 42 65 73 74 49 6e 64   to the xBestInd
2c20: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 76 69 72  ex method of vir
2c30: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 46 6f  tual tables.  Fo
2c40: 72 6d 73 20 6f 66 20 69 6e 74 65 72 65 73 74 20  rms of interest 
2c50: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
2c60: 20 20 20 20 20 20 20 20 45 78 70 72 65 73 73 69          Expressi
2c70: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
2c80: 20 20 20 20 20 56 69 72 74 75 61 6c 20 54 61 62       Virtual Tab
2c90: 6c 65 20 4f 70 65 72 61 74 6f 72 0a 2a 2a 20 20  le Operator.**  
2ca0: 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
2cc0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 31  ------.**      1
2cf0: 2e 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  .  column MATCH 
2d00: 65 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  expr            
2d10: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
2d20: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 0a 2a 2a  STRAINT_MATCH.**
2d30: 20 20 20 20 20 20 32 2e 20 20 63 6f 6c 75 6d 6e        2.  column
2d40: 20 47 4c 4f 42 20 65 78 70 72 20 20 20 20 20 20   GLOB expr      
2d50: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
2d60: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
2d70: 4c 4f 42 0a 2a 2a 20 20 20 20 20 20 33 2e 20 20  LOB.**      3.  
2d80: 63 6f 6c 75 6d 6e 20 4c 49 4b 45 20 65 78 70 72  column LIKE expr
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2da0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
2db0: 41 49 4e 54 5f 4c 49 4b 45 0a 2a 2a 20 20 20 20  AINT_LIKE.**    
2dc0: 20 20 34 2e 20 20 63 6f 6c 75 6d 6e 20 52 45 47    4.  column REG
2dd0: 45 58 50 20 65 78 70 72 20 20 20 20 20 20 20 20  EXP expr        
2de0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f     SQLITE_INDEX_
2df0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 45 47 45 58  CONSTRAINT_REGEX
2e00: 50 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 63 6f  P.**      5.  co
2e10: 6c 75 6d 6e 20 21 3d 20 65 78 70 72 20 20 20 20  lumn != expr    
2e20: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2e30: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
2e40: 4e 54 5f 4e 45 0a 2a 2a 20 20 20 20 20 20 36 2e  NT_NE.**      6.
2e50: 20 20 65 78 70 72 20 21 3d 20 63 6f 6c 75 6d 6e    expr != column
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2e70: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
2e80: 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a 20 20 20 20  TRAINT_NE.**    
2e90: 20 20 37 2e 20 20 63 6f 6c 75 6d 6e 20 49 53 20    7.  column IS 
2ea0: 4e 4f 54 20 65 78 70 72 20 20 20 20 20 20 20 20  NOT expr        
2eb0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f     SQLITE_INDEX_
2ec0: 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54  CONSTRAINT_ISNOT
2ed0: 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 65 78 70  .**      8.  exp
2ee0: 72 20 49 53 20 4e 4f 54 20 63 6f 6c 75 6d 6e 20  r IS NOT column 
2ef0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2f00: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
2f10: 54 5f 49 53 4e 4f 54 0a 2a 2a 20 20 20 20 20 20  T_ISNOT.**      
2f20: 39 2e 20 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 4f  9.  column IS NO
2f30: 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  T NULL          
2f40: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
2f50: 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55  NSTRAINT_ISNOTNU
2f60: 4c 4c 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 76 65 72  LL.**.** In ever
2f70: 79 20 63 61 73 65 2c 20 22 63 6f 6c 75 6d 6e 22  y case, "column"
2f80: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d   must be a colum
2f90: 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  n of a virtual t
2fa0: 61 62 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  able.  If there.
2fb0: 2a 2a 20 69 73 20 61 20 6d 61 74 63 68 2c 20 73  ** is a match, s
2fc0: 65 74 20 2a 70 70 4c 65 66 74 20 74 6f 20 74 68  et *ppLeft to th
2fd0: 65 20 22 63 6f 6c 75 6d 6e 22 20 65 78 70 72 65  e "column" expre
2fe0: 73 73 69 6f 6e 2c 20 73 65 74 20 2a 70 70 52 69  ssion, set *ppRi
2ff0: 67 68 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 22  ght to the .** "
3000: 65 78 70 72 22 20 65 78 70 72 65 73 73 69 6f 6e  expr" expression
3010: 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 6e   (even though in
3020: 20 66 6f 72 6d 73 20 28 36 29 20 61 6e 64 20 28   forms (6) and (
3030: 38 29 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  8) the column is
3040: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 69 67 68 74   on the.** right
3050: 20 61 6e 64 20 74 68 65 20 65 78 70 72 65 73 73   and the express
3060: 69 6f 6e 20 69 73 20 6f 6e 20 74 68 65 20 6c 65  ion is on the le
3070: 66 74 29 2e 20 20 41 6c 73 6f 20 73 65 74 20 2a  ft).  Also set *
3080: 70 65 4f 70 32 20 74 6f 20 74 68 65 0a 2a 2a 20  peOp2 to the.** 
3090: 61 70 70 72 6f 70 72 69 61 74 65 20 76 69 72 74  appropriate virt
30a0: 75 61 6c 20 74 61 62 6c 65 20 6f 70 65 72 61 74  ual table operat
30b0: 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  or.  The return 
30c0: 76 61 6c 75 65 20 69 73 20 31 20 6f 72 20 32 20  value is 1 or 2 
30d0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  if there.** is a
30e0: 20 6d 61 74 63 68 2e 20 20 54 68 65 20 75 73 75   match.  The usu
30f0: 61 6c 20 72 65 74 75 72 6e 20 69 73 20 31 2c 20  al return is 1, 
3100: 62 75 74 20 69 66 20 74 68 65 20 52 48 53 20 69  but if the RHS i
3110: 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 0a  s also a column.
3120: 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ** of virtual ta
3130: 62 6c 65 20 69 6e 20 66 6f 72 6d 73 20 28 35 29  ble in forms (5)
3140: 20 6f 72 20 28 37 29 20 74 68 65 6e 20 72 65 74   or (7) then ret
3150: 75 72 6e 20 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urn 2..**.** If 
3160: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
3170: 61 74 63 68 65 73 20 6e 6f 6e 65 20 6f 66 20 74  atches none of t
3180: 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76  he patterns abov
3190: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  e, return 0..*/.
31a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 75 78  static int isAux
31b0: 69 6c 69 61 72 79 56 74 61 62 4f 70 65 72 61 74  iliaryVtabOperat
31c0: 6f 72 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or(.  Expr *pExp
31d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
31e0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
31f0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
3200: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3210: 20 2a 70 65 4f 70 32 2c 20 20 20 20 20 20 20 20   *peOp2,        
3220: 20 20 20 2f 2a 20 4f 55 54 3a 20 30 20 66 6f 72     /* OUT: 0 for
3230: 20 4d 41 54 43 48 2c 20 6f 72 20 65 6c 73 65 20   MATCH, or else 
3240: 61 6e 20 6f 70 32 20 76 61 6c 75 65 20 2a 2f 0a  an op2 value */.
3250: 20 20 45 78 70 72 20 2a 2a 70 70 4c 65 66 74 2c    Expr **ppLeft,
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 65 78 70 72    /* Column expr
3280: 65 73 73 69 6f 6e 20 74 6f 20 6c 65 66 74 20 6f  ession to left o
3290: 66 20 4d 41 54 43 48 2f 6f 70 32 20 2a 2f 0a 20  f MATCH/op2 */. 
32a0: 20 45 78 70 72 20 2a 2a 70 70 52 69 67 68 74 20   Expr **ppRight 
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
32d0: 6f 20 6c 65 66 74 20 6f 66 20 4d 41 54 43 48 2f  o left of MATCH/
32e0: 6f 70 32 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  op2 */.){.  if( 
32f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
3300: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 74  NCTION ){.    st
3310: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
3320: 74 20 4f 70 32 20 7b 0a 20 20 20 20 20 20 63 6f  t Op2 {.      co
3330: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20  nst char *zOp;. 
3340: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
3350: 61 72 20 65 4f 70 32 3b 0a 20 20 20 20 7d 20 61  ar eOp2;.    } a
3360: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  Op[] = {.      {
3370: 20 22 6d 61 74 63 68 22 2c 20 20 53 51 4c 49 54   "match",  SQLIT
3380: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
3390: 4e 54 5f 4d 41 54 43 48 20 7d 2c 0a 20 20 20 20  NT_MATCH },.    
33a0: 20 20 7b 20 22 67 6c 6f 62 22 2c 20 20 20 53 51    { "glob",   SQ
33b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
33c0: 52 41 49 4e 54 5f 47 4c 4f 42 20 7d 2c 0a 20 20  RAINT_GLOB },.  
33d0: 20 20 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20      { "like",   
33e0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
33f0: 53 54 52 41 49 4e 54 5f 4c 49 4b 45 20 7d 2c 0a  STRAINT_LIKE },.
3400: 20 20 20 20 20 20 7b 20 22 72 65 67 65 78 70 22        { "regexp"
3410: 2c 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  , SQLITE_INDEX_C
3420: 4f 4e 53 54 52 41 49 4e 54 5f 52 45 47 45 58 50  ONSTRAINT_REGEXP
3430: 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 45 78   }.    };.    Ex
3440: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
3450: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 3b 20 20     Expr *pCol;  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65 66     /* Column ref
3480: 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 69 6e  erence */.    in
3490: 74 20 69 3b 0a 0a 20 20 20 20 70 4c 69 73 74 20  t i;..    pList 
34a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
34b0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
34c0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
34d0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  pr!=2 ){.      r
34e0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
34f0: 20 20 20 70 43 6f 6c 20 3d 20 70 4c 69 73 74 2d     pCol = pList-
3500: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
3510: 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 21 3d 54   if( pCol->op!=T
3520: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 21 49 73 56  K_COLUMN || !IsV
3530: 69 72 74 75 61 6c 28 70 43 6f 6c 2d 3e 70 54 61  irtual(pCol->pTa
3540: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  b) ){.      retu
3550: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
3560: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
3570: 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b  Size(aOp); i++){
3580: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3590: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
35a0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 61 4f 70 5b 69  >u.zToken, aOp[i
35b0: 5d 2e 7a 4f 70 29 3d 3d 30 20 29 7b 0a 20 20 20  ].zOp)==0 ){.   
35c0: 20 20 20 20 20 2a 70 65 4f 70 32 20 3d 20 61 4f       *peOp2 = aO
35d0: 70 5b 69 5d 2e 65 4f 70 32 3b 0a 20 20 20 20 20  p[i].eOp2;.     
35e0: 20 20 20 2a 70 70 52 69 67 68 74 20 3d 20 70 4c     *ppRight = pL
35f0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
3600: 0a 20 20 20 20 20 20 20 20 2a 70 70 4c 65 66 74  .        *ppLeft
3610: 20 3d 20 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = pCol;.       
3620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
3640: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3650: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
3660: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 7c 7c 20  op==TK_ISNOT || 
3670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
3680: 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74  TNULL ){.    int
3690: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 45 78   res = 0;.    Ex
36a0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
36b0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78  r->pLeft;.    Ex
36c0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
36d0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
36e0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
36f0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
3700: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61  rtual(pLeft->pTa
3710: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 2b  b) ){.      res+
3720: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
3730: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
3740: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
3750: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 52   && IsVirtual(pR
3760: 69 67 68 74 2d 3e 70 54 61 62 29 20 29 7b 0a 20  ight->pTab) ){. 
3770: 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20       res++;.    
3780: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 20 70 4c    SWAP(Expr*, pL
3790: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
37a0: 20 20 7d 0a 20 20 20 20 2a 70 70 4c 65 66 74 20    }.    *ppLeft 
37b0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 2a 70 70  = pLeft;.    *pp
37c0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
37d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
37e0: 70 3d 3d 54 4b 5f 4e 45 20 29 20 2a 70 65 4f 70  p==TK_NE ) *peOp
37f0: 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  2 = SQLITE_INDEX
3800: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3b 0a  _CONSTRAINT_NE;.
3810: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
3820: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 20 2a 70  p==TK_ISNOT ) *p
3830: 65 4f 70 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e  eOp2 = SQLITE_IN
3840: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
3850: 53 4e 4f 54 3b 0a 20 20 20 20 69 66 28 20 70 45  SNOT;.    if( pE
3860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
3870: 55 4c 4c 20 29 20 2a 70 65 4f 70 32 20 3d 20 53  ULL ) *peOp2 = S
3880: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
3890: 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c  TRAINT_ISNOTNULL
38a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
38b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
38c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
38d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
38e0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
38f0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
3900: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
3910: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
3920: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
3930: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
3940: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
3950: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
3960: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
3970: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
3980: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
3990: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
39a0: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
39b0: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72  ase){.  if( pDer
39c0: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72  ived ){.    pDer
39d0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
39e0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
39f0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70  _FromJoin;.    p
3a00: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
3a10: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
3a20: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
3a30: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
3a40: 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64  Mark term iChild
3a50: 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c   as being a chil
3a60: 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e  d of term iParen
3a70: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
3a80: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
3a90: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
3aa0: 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69  C, int iChild, i
3ab0: 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70  nt iParent){.  p
3ac0: 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50  WC->a[iChild].iP
3ad0: 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b  arent = iParent;
3ae0: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64  .  pWC->a[iChild
3af0: 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57  ].truthProb = pW
3b00: 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72  C->a[iParent].tr
3b10: 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e  uthProb;.  pWC->
3b20: 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c  a[iParent].nChil
3b30: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d++;.}../*.** Re
3b40: 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e  turn the N-th AN
3b50: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  D-connected subt
3b60: 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f  erm of pTerm.  O
3b70: 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f  r if pTerm is no
3b80: 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69  t.** a conjuncti
3b90: 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  on, then return 
3ba0: 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20  just pTerm when 
3bb0: 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65  N==0.  If N is e
3bc0: 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75  xceeds.** the nu
3bd0: 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
3be0: 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75  e subterms, retu
3bf0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
3c00: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
3c10: 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68  ereNthSubterm(Wh
3c20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
3c30: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54  int N){.  if( pT
3c40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
3c50: 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65  WO_AND ){.    re
3c60: 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72  turn N==0 ? pTer
3c70: 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  m : 0;.  }.  if(
3c80: 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   N<pTerm->u.pAnd
3c90: 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29  Info->wc.nTerm )
3ca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 54  {.    return &pT
3cb0: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
3cc0: 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20  >wc.a[N];.  }.  
3cd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3ce0: 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65  ** Subterms pOne
3cf0: 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f   and pTwo are co
3d00: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57  ntained within W
3d10: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
3d20: 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62    The.** two sub
3d30: 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73  terms are in dis
3d40: 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20  junction - they 
3d50: 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  are OR-ed togeth
3d60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
3d70: 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  se two terms are
3d80: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72   both of the for
3d90: 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69 74  m:  "A op B" wit
3da0: 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20  h the same.** A 
3db0: 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75 74  and B values but
3dc0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
3dd0: 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  tors and if the 
3de0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
3df0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20   compatible (if 
3e00: 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65  one is = and the
3e10: 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72   other is <, for
3e20: 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a   example) then.*
3e30: 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74  * add a new virt
3e40: 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f 20  ual AND term to 
3e50: 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65 20  pWC that is the 
3e60: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
3e70: 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a  he.** two..**.**
3e80: 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a 0a   Some examples:.
3e90: 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20  **.**    x<y OR 
3ea0: 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78  x=y    -->     x
3eb0: 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f 52  <=y.**    x=y OR
3ec0: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20   x=y    -->     
3ed0: 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20 4f  x=y.**    x<=y O
3ee0: 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20 20  R x<y   -->     
3ef0: 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  x<=y.**.** The f
3f00: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54 20  ollowing is NOT 
3f10: 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  generated:.**.**
3f20: 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20 20      x<y OR x>y  
3f30: 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20 20    -->     x!=y  
3f40: 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f     .*/.static vo
3f50: 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44  id whereCombineD
3f60: 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63 4c  isjuncts(.  SrcL
3f70: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
3f80: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
3f90: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
3fa0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
3fb0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
3fc0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
3fd0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
3fe0: 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  One,       /* Fi
3ff0: 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a  rst disjunct */.
4000: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77    WhereTerm *pTw
4010: 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  o        /* Seco
4020: 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 29  nd disjunct */.)
4030: 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4f  {.  u16 eOp = pO
4040: 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 20  ne->eOperator | 
4050: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  pTwo->eOperator;
4060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4080: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4090: 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a 2f   (for malloc) */
40a0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
40c0: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73   virtual express
40d0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72 20  /* Operator for 
4100: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78 70  the combined exp
4110: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
4120: 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20 20   idxNew;        
4130: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
4140: 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74 20  pWC of the next 
4150: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f 0a  virtual term */.
4160: 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65 4f  .  if( (pOne->eO
4170: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
4180: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
4190: 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20  GT|WO_GE))==0 ) 
41a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70  return;.  if( (p
41b0: 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Two->eOperator &
41c0: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
41d0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  _LE|WO_GT|WO_GE)
41e0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
41f0: 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
4200: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  EQ|WO_LT|WO_LE))
4210: 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f 70  !=eOp.   && (eOp
4220: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54 7c   & (WO_EQ|WO_GT|
4230: 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20 72  WO_GE))!=eOp ) r
4240: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4250: 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c   pOne->pExpr->pL
4260: 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d 3e  eft!=0 && pOne->
4270: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30  pExpr->pRight!=0
4280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4290: 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  wo->pExpr->pLeft
42a0: 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45 78  !=0 && pTwo->pEx
42b0: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pr->pRight!=0 );
42c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
42d0: 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e 65  prCompare(0,pOne
42e0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  ->pExpr->pLeft, 
42f0: 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  pTwo->pExpr->pLe
4300: 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  ft, -1) ) return
4310: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
4320: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e  xprCompare(0,pOn
4330: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e->pExpr->pRight
4340: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
4350: 52 69 67 68 74 2c 2d 31 29 20 29 72 65 74 75 72  Right,-1) )retur
4360: 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  n;.  /* If we re
4370: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
4380: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f  it means the two
4390: 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65   subterms can be
43a0: 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69   combined */.  i
43b0: 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31  f( (eOp & (eOp-1
43c0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
43d0: 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
43e0: 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f  _LE) ){.      eO
43f0: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d  p = WO_LE;.    }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4410: 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  rt( eOp & (WO_GT
4420: 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20  |WO_GE) );.     
4430: 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20   eOp = WO_GE;.  
4440: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70    }.  }.  db = p
4450: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
4460: 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
4470: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4480: 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c  db, pOne->pExpr,
4490: 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   0);.  if( pNew=
44a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
44b0: 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70  or(op=TK_EQ; eOp
44c0: 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  !=(WO_EQ<<(op-TK
44d0: 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73  _EQ)); op++){ as
44e0: 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29  sert( op<TK_GE )
44f0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ; }.  pNew->op =
4500: 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20   op;.  idxNew = 
4510: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4520: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
4530: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
4540: 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41  YNAMIC);.  exprA
4550: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
4560: 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69  , idxNew);.}..#i
4570: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4580: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
4590: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
45a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
45b0: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
45c0: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
45d0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
45e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  two or more OR-c
45f0: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74  onnected.** subt
4600: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a  erms.  So in:.**
4610: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52  .**     ... WHER
4620: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d  E  (a=5) AND (b=
4630: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33  7 OR c=9 OR d=13
4640: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20  ) AND (d=13).** 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e           ^^^^^^^
4670: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a  ^^^^^^^^^^^^^.**
4680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4690: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20   analyzes terms 
46a0: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64  such as the midd
46b0: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61  le term in the a
46c0: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a  bove example..**
46d0: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f   A WhereOrTerm o
46e0: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65  bject is compute
46f0: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74  d and attached t
4700: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72  o the term under
4710: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65  .** analysis, re
4720: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
4730: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61  outcome of the a
4740: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a  nalysis.  Hence:
4750: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
4760: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c  Term.wtFlags   |
4770: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a  =  TERM_ORINFO.*
4780: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
4790: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20  u.pOrInfo  =  a 
47a0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
47b0: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72  cated WhereOrTer
47c0: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54  m object.**.** T
47d0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  he term being an
47e0: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65  alyzed must have
47f0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
4800: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  OR-connected sub
4810: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67  terms..** A sing
4820: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74  le subterm might
4830: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
4840: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
4850: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
4860: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
4870: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
4880: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
4890: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
48a0: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
48b0: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
48c0: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
48d0: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
48e0: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
48f0: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
4900: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
4910: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
4920: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
4930: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
4940: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
4950: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
4960: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
4970: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
4980: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
4990: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
49a0: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20  AND r.z=6).**   
49b0: 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52    (F)     x>A OR
49c0: 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a   (x=A AND y>=B).
49d0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
49e0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
49f0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
4a00: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
4a10: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
4a20: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20  umn of C and.** 
4a30: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
4a40: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78   (as shown in ex
4a50: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74  ample B above) t
4a60: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
4a70: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
4a80: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69   that is an equi
4a90: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73  valent IN expres
4aa0: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  sion.  In other 
4ab0: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65  words, if the te
4ac0: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c  rm.** being anal
4ad0: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  yzed is:.**.**  
4ae0: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
4af0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
4b00: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a    x = expr3.**.*
4b10: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
4b20: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
4b30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
4b40: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
4b50: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
4b60: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a  **.** CASE 2:.**
4b70: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
4b80: 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73   exactly two dis
4b90: 6a 75 6e 63 74 73 20 61 6e 64 20 6f 6e 65 20 73  juncts and one s
4ba0: 69 64 65 20 68 61 73 20 78 3e 41 20 61 6e 64 20  ide has x>A and 
4bb0: 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 0a 2a  the other side.*
4bc0: 2a 20 68 61 73 20 78 3d 41 20 28 66 6f 72 20 74  * has x=A (for t
4bd0: 68 65 20 73 61 6d 65 20 78 20 61 6e 64 20 41 29  he same x and A)
4be0: 20 74 68 65 6e 20 61 64 64 20 61 20 6e 65 77 20   then add a new 
4bf0: 76 69 72 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74  virtual conjunct
4c00: 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20   term to the.** 
4c10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
4c20: 74 68 65 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e  the form "x>=A".
4c30: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
4c40: 20 20 20 20 20 20 78 3e 41 20 4f 52 20 28 78 3d        x>A OR (x=
4c50: 41 20 41 4e 44 20 79 3e 42 29 20 20 20 20 61 64  A AND y>B)    ad
4c60: 64 73 3a 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a  ds:    x>=A.**.*
4c70: 2a 20 54 68 65 20 61 64 64 65 64 20 63 6f 6e 6a  * The added conj
4c80: 75 6e 63 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d  unct can sometim
4c90: 65 73 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e  es be helpful in
4ca0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e   query planning.
4cb0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a  .**.** CASE 3:.*
4cc0: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
4cd0: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
4ce0: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
4cf0: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
4d00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
4d10: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
4d30: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
4d40: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
4d50: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
4d60: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
4d70: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
4d80: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
4d90: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
4da0: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
4db0: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
4dc0: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
4dd0: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
4de0: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
4df0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
4e00: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
4e10: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
4e20: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
4e30: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
4e40: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
4e50: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
4e60: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
4e70: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
4e80: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
4e90: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
4ea0: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
4eb0: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
4ec0: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
4ed0: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
4ee0: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
4ef0: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
4f00: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
4f10: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
4f20: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
4f30: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
4f40: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
4f50: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
4f60: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
4f70: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
4f80: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
4f90: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
4fa0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
4fb0: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
4fc0: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
4fd0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
4fe0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4ff0: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
5000: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63  ; that.** is dec
5010: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20  ided elsewhere. 
5020: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f   This analysis o
5030: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
5040: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a  ther subterms.**
5050: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5060: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e   indexing exist.
5070: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70  .**.** All examp
5080: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20  les A through E 
5090: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61  above satisfy ca
50a0: 73 65 20 33 2e 20 20 42 75 74 20 69 66 20 61 20  se 3.  But if a 
50b0: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74  term.** also sat
50c0: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
50d0: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
50e0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
50f0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
5100: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
5110: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
5120: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
5130: 61 74 20 63 61 73 65 20 33 20 69 73 20 6e 6f 74  at case 3 is not
5140: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
5150: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
5160: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
5170: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
5180: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
5190: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
51a0: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
51b0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
51c0: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
51d0: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
51e0: 74 69 73 66 79 20 63 61 73 65 20 33 20 61 72 65  tisfy case 3 are
51f0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
5200: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
5210: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
5220: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
5230: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
5240: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
5250: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
5260: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
5270: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
5280: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
5290: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
52a0: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
52b0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
52c0: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
52d0: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
52e0: 20 6e 6f 6e 65 20 6f 66 20 63 61 73 65 73 20 31   none of cases 1
52f0: 2c 20 32 2c 20 6f 72 20 33 20 61 70 70 6c 79 2c  , 2, or 3 apply,
5300: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
5310: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
5320: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
5330: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
5340: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
5350: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5360: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
5370: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
5380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5390: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
53a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
53b0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
53c0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
53d0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
53e0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
53f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5400: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
5410: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
5420: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  d */.){.  WhereI
5430: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57  nfo *pWInfo = pW
5440: 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  C->pWInfo;      
5450: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
5460: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
5470: 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
5480: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
5490: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
54a0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
54b0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
54c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
54d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
54e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
54f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
5500: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
5510: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
5520: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
5530: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
5540: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
5550: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5570: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
5580: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
5590: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
55c0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
55d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
55e0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
55f0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
5600: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
5610: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
5620: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
5630: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
5640: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
5650: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
5660: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
5670: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5680: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5690: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
56a0: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
56b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
56c0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
56d0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
56e0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
56f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
5700: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
5710: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
5720: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
5730: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
5740: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
5750: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
5760: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
5770: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
5780: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
5790: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
57a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
57b0: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
57c0: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
57d0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
57e0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
57f0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
5800: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
5810: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5820: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
5830: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
5840: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
5850: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
5860: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
5870: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
5880: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
5890: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
58a0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
58b0: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
58c0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
58d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
58e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
58f0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
5900: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 6d 65 6d  rInfo->wc;.  mem
5910: 73 65 74 28 70 4f 72 57 63 2d 3e 61 53 74 61 74  set(pOrWc->aStat
5920: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  ic, 0, sizeof(pO
5930: 72 57 63 2d 3e 61 53 74 61 74 69 63 29 29 3b 0a  rWc->aStatic));.
5940: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
5950: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
5960: 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
5970: 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 4f 72  e3WhereSplit(pOr
5980: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
5990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
59a0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72  eExprAnalyze(pSr
59b0: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
59c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
59d0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
59e0: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
59f0: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
5a00: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
5a10: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
5a20: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
5a30: 20 63 61 73 65 73 20 31 20 6f 72 20 33 2e 0a 20   cases 1 or 3.. 
5a40: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
5a50: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
5a60: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
5a70: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
5a80: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
5a90: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
5aa0: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
5ab0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
5ac0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
5ad0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
5ae0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
5af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
5b00: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
5b10: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
5b20: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
5b30: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
5b40: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
5b50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
5b60: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
5b70: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
5b80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
5b90: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  N(db, sizeof(*pA
5ba0: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
5bb0: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
5bc0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
5bd0: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
5be0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
5bf0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
5c00: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
5c10: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
5c20: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
5c30: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
5c40: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
5c50: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
5c60: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
5c70: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
5c80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
5c90: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
5ca0: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
5cb0: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 6d  o->wc;.        m
5cc0: 65 6d 73 65 74 28 70 41 6e 64 57 43 2d 3e 61 53  emset(pAndWC->aS
5cd0: 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66  tatic, 0, sizeof
5ce0: 28 70 41 6e 64 57 43 2d 3e 61 53 74 61 74 69 63  (pAndWC->aStatic
5cf0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
5d00: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
5d10: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
5d20: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
5d30: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
5d40: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
5d50: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
5d60: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
5d70: 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c  te3WhereExprAnal
5d80: 79 7a 65 28 70 53 72 63 2c 20 70 41 6e 64 57 43  yze(pSrc, pAndWC
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
5da0: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
5db0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
5dc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
5de0: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
5df0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
5e00: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
5e10: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
5e20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5e30: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20  pAndTerm->pExpr 
5e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
5e50: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e  f( allowedOp(pAn
5e60: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  dTerm->pExpr->op
5e70: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
5e80: 7c 7c 20 70 41 6e 64 54 65 72 6d 2d 3e 65 4f 70  || pAndTerm->eOp
5e90: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 55 58 0a 20  erator==WO_AUX. 
5ea0: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
5ec0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
5ed0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
5ee0: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
5ef0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
5f00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5f20: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
5f30: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
5f40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
5f50: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
5f60: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
5f70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
5f80: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
5f90: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
5fa0: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
5fb0: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
5fc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
5fd0: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
5fe0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
5ff0: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
6000: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33       b = sqlite3
6010: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
6020: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
6030: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
6040: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
6050: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
6060: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6070: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
6080: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
6090: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
60a0: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
60b0: 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65 33      b |= sqlite3
60c0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
60d0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
60e0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
60f0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
6100: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
6110: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
6120: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
6130: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
6140: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
6150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
6160: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
6170: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
6180: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6190: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
61a0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
61b0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
61c0: 65 20 33 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 3.  The set mi
61d0: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
61e0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
61f0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
6200: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
6210: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
6220: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
6230: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 20 46  : WO_OR;..  /* F
6240: 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f 52 2c  or a two-way OR,
6250: 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d 70 6c   attempt to impl
6260: 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73 65 20  ementation case 
6270: 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 6e  2..  */.  if( in
6280: 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72 57 63  dexable && pOrWc
6290: 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a 20 20  ->nTerm==2 ){.  
62a0: 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30 3b 0a    int iOne = 0;.
62b0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
62c0: 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  One;.    while( 
62d0: 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e 74 68  (pOne = whereNth
62e0: 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e  Subterm(&pOrWc->
62f0: 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d 30  a[0],iOne++))!=0
6300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
6310: 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68  wo = 0;.      Wh
6320: 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b 0a 20  ereTerm *pTwo;. 
6330: 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 54 77       while( (pTw
6340: 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62 74  o = whereNthSubt
6350: 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 31 5d  erm(&pOrWc->a[1]
6360: 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29 7b 0a  ,iTwo++))!=0 ){.
6370: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f 6d          whereCom
6380: 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 70 53  bineDisjuncts(pS
6390: 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c 20 70  rc, pWC, pOne, p
63a0: 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Two);.      }.  
63b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
63c0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
63d0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
63e0: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
63f0: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
6400: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
6410: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
6420: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
6430: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
6440: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
6450: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
6460: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
6470: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
6480: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
6490: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
64a0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
64b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
64c0: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
64d0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
64e0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
64f0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
6500: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
6510: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
6520: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
6530: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
6540: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
6550: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
6560: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
6570: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
6580: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
6590: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
65a0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
65b0: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
65c0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
65d0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
65e0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
65f0: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
6600: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
6610: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
6620: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
6630: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
6640: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
6650: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
6660: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
6670: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
6680: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
6690: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
66a0: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
66b0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
66c0: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
66d0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
66e0: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
66f0: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
6700: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
6710: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
6720: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
6730: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
6740: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
6750: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
6760: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
6770: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
6780: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
6790: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
67a0: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
67b0: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
67c0: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
67d0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
67e0: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
67f0: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
6800: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
6810: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
6820: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
6830: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
6840: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
6850: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
6860: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
6870: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
6880: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
6890: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
68a0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
68b0: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
68c0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
68d0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
68e0: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
68f0: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
6920: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
6930: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
6940: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
6950: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
6960: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
6970: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
6980: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
6990: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
69a0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
69b0: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
69c0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
69d0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
69e0: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
69f0: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
6a00: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
6a10: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
6a20: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
6a30: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
6a40: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
6a50: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
6a60: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
6a70: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
6a80: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
6a90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
6aa0: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
6ab0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
6ac0: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
6ad0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
6ae0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
6af0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
6b00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
6b10: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
6b20: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
6b40: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
6b50: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
6b60: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
6b70: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
6b80: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
6b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
6ba0: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
6bb0: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
6bc0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
6bd0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
6be0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
6bf0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
6c00: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
6c10: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
6c20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
6c30: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
6c40: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6c60: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
6c70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
6c80: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
6c90: 61 73 6b 53 65 74 2c 0a 20 20 20 20 20 20 20 20  askSet,.        
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66      pOrTerm->lef
6cd0: 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a  tCursor))==0 ){.
6ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
6cf0: 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f  s term must be o
6d00: 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d  f the form t1.a=
6d10: 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69  =t2.b where t2 i
6d20: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
6d30: 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73     ** chngToIN s
6d40: 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74  et but t1 is not
6d50: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c  .  This term wil
6d60: 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63  l be either prec
6d70: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  eded.          *
6d80: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20  * or follwed by 
6d90: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79  an inverted copy
6da0: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20   (t2.b==t1.a).  
6db0: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a  Skip this term .
6dc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
6dd0: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69   use its inversi
6de0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
6df0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
6e00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
6e10: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20  RM_COPIED );.   
6e20: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
6e30: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
6e40: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
6e50: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
6e60: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77  sert( pOrTerm->w
6e70: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
6e80: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  OPIED|TERM_VIRTU
6e90: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  AL) );.         
6ea0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f     }.        iCo
6ec0: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  lumn = pOrTerm->
6ed0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
6ee0: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
6ef0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
6f00: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sor;.        bre
6f10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f20: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
6f30: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69       /* No candi
6f40: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d  date table+colum
6f50: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68  n was found.  Th
6f60: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
6f70: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  r.        ** on 
6f80: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
6f90: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
6fa0: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
6fb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6fc0: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e  IsPowerOfTwo(chn
6fd0: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  gToIN) );.      
6fe0: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f    assert( chngTo
6ff0: 49 4e 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65  IN==sqlite3Where
7000: 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
7010: 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  >sMaskSet, iCurs
7020: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
7030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7040: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
7050: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
7060: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
7070: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
7080: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
7090: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
70a0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
70b0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
70c0: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
70d0: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
70e0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
70f0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
7100: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
7110: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
7120: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
7130: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
7140: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
7150: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
7160: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
7170: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7180: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
7190: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
71a0: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
71b0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
71c0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
71d0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
71e0: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
71f0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
7200: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
7210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7220: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
7230: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
7240: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
7250: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
7260: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
7270: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
7280: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
7290: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
72a0: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
72b0: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
72c0: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
72d0: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
72e0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
72f0: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
7300: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
7310: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
7320: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
7330: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
7340: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
7350: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
7360: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
7370: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
7380: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
7390: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
73a0: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
73b0: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
73c0: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
73d0: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
73e0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
73f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7400: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7410: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7420: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
7430: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7440: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
7450: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
7460: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
7470: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
7480: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
7490: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
74a0: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
74b0: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
74c0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
74d0: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
74e0: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
74f0: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
7500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7510: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
7520: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
7530: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
7540: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
7550: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
7560: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
7570: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
7580: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
7590: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
75a0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
75b0: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
75c0: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
75d0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
75e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
75f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
7600: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
7610: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
7620: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
7630: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7640: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
7650: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
7660: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
7670: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7680: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
7690: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
76a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
76b0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
76c0: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
76e0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
76f0: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
7700: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
7710: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
7720: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
7730: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
7740: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7750: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
7760: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7770: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
7780: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7790: 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
77a0: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a  , pList, pDup);.
77b0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
77c0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
77d0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pLeft;.      }. 
77e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
77f0: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft!=0 );.      p
7800: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
7810: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
7820: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  0);.      pNew =
7830: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7840: 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75  arse, TK_IN, pDu
7850: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 0);.      if(
7860: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
7870: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
7880: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
7890: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
78a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
78b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
78c0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
78d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
78e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
78f0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
7900: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
7910: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
7920: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
7930: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
7940: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
7950: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
7960: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
7970: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
7980: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
7990: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
79a0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
79b0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54 65  ;.        markTe
79c0: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69  rmAsChild(pWC, i
79d0: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b  dxNew, idxTerm);
79e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
79f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7a00: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7a10: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
7a20: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
7a30: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
7a40: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
7a50: 6d 70 73 20 63 61 73 65 20 33 20 2a 2f 0a 20 20  mps case 3 */.  
7a60: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
7a70: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
7a80: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
7a90: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
7aa0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
7ab0: 0a 2a 2a 20 57 65 20 61 6c 72 65 61 64 79 20 6b  .** We already k
7ac0: 6e 6f 77 20 74 68 61 74 20 70 45 78 70 72 20 69  now that pExpr i
7ad0: 73 20 61 20 62 69 6e 61 72 79 20 6f 70 65 72 61  s a binary opera
7ae0: 74 6f 72 20 77 68 65 72 65 20 62 6f 74 68 20 6f  tor where both o
7af0: 70 65 72 61 6e 64 73 20 61 72 65 0a 2a 2a 20 63  perands are.** c
7b00: 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
7b10: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7b20: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
7b30: 20 70 45 78 70 72 20 69 73 20 61 6e 20 65 71 75   pExpr is an equ
7b40: 69 76 61 6c 65 6e 63 65 0a 2a 2a 20 72 65 6c 61  ivalence.** rela
7b50: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 31 2e 20 20 54  tion:.**   1.  T
7b60: 68 65 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69  he SQLITE_Transi
7b70: 74 69 76 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tive optimizatio
7b80: 6e 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c 65  n must be enable
7b90: 64 0a 2a 2a 20 20 20 32 2e 20 20 4d 75 73 74 20  d.**   2.  Must 
7ba0: 62 65 20 65 69 74 68 65 72 20 61 6e 20 3d 3d 20  be either an == 
7bb0: 6f 72 20 61 6e 20 49 53 20 6f 70 65 72 61 74 6f  or an IS operato
7bc0: 72 0a 2a 2a 20 20 20 33 2e 20 20 4e 6f 74 20 6f  r.**   3.  Not o
7bd0: 72 69 67 69 6e 61 74 69 6e 67 20 69 6e 20 74 68  riginating in th
7be0: 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
7bf0: 6e 20 4f 55 54 45 52 20 4a 4f 49 4e 0a 2a 2a 20  n OUTER JOIN.** 
7c00: 20 20 34 2e 20 20 54 68 65 20 61 66 66 69 6e 69    4.  The affini
7c10: 74 69 65 73 20 6f 66 20 41 20 61 6e 64 20 42 20  ties of A and B 
7c20: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  must be compatib
7c30: 6c 65 0a 2a 2a 20 20 20 35 61 2e 20 42 6f 74 68  le.**   5a. Both
7c40: 20 6f 70 65 72 61 6e 64 73 20 75 73 65 20 74 68   operands use th
7c50: 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
7c60: 20 73 65 71 75 65 6e 63 65 20 4f 52 0a 2a 2a 20   sequence OR.** 
7c70: 20 20 35 62 2e 20 54 68 65 20 6f 76 65 72 61 6c    5b. The overal
7c80: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
7c90: 65 6e 63 65 20 69 73 20 42 49 4e 41 52 59 0a 2a  ence is BINARY.*
7ca0: 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
7cb0: 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 2c 20  e returns TRUE, 
7cc0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
7cd0: 74 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73  the RHS can be s
7ce0: 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 66 6f  ubstituted.** fo
7cf0: 72 20 74 68 65 20 4c 48 53 20 61 6e 79 70 6c 61  r the LHS anypla
7d00: 63 65 20 65 6c 73 65 20 69 6e 20 74 68 65 20 57  ce else in the W
7d10: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
7d20: 65 20 74 68 65 20 4c 48 53 20 63 6f 6c 75 6d 6e  e the LHS column
7d30: 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 54 68 69 73   occurs..** This
7d40: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
7d50: 69 6f 6e 2e 20 20 4e 6f 20 68 61 72 6d 20 63 6f  ion.  No harm co
7d60: 6d 65 73 20 66 72 6f 6d 20 72 65 74 75 72 6e 69  mes from returni
7d70: 6e 67 20 30 2e 20 20 42 75 74 20 69 66 20 31 20  ng 0.  But if 1 
7d80: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  is.** returned w
7d90: 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  hen it should no
7da0: 74 20 62 65 2c 20 74 68 65 6e 20 69 6e 63 6f 72  t be, then incor
7db0: 72 65 63 74 20 61 6e 73 77 65 72 73 20 6d 69 67  rect answers mig
7dc0: 68 74 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ht result..*/.st
7dd0: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 49 73 45  atic int termIsE
7de0: 71 75 69 76 61 6c 65 6e 63 65 28 50 61 72 73 65  quivalence(Parse
7df0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7e00: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
7e10: 66 66 31 2c 20 61 66 66 32 3b 0a 20 20 43 6f 6c  ff1, aff2;.  Col
7e20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
7e30: 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  f( !Optimization
7e40: 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
7e50: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
7e60: 69 74 69 76 65 29 20 29 20 72 65 74 75 72 6e 20  itive) ) return 
7e70: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
7e80: 6f 70 21 3d 54 4b 5f 45 51 20 26 26 20 70 45 78  op!=TK_EQ && pEx
7e90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 20  pr->op!=TK_IS ) 
7ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7eb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7ec0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
7ed0: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7ee0: 20 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33    aff1 = sqlite3
7ef0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
7f00: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 66  pr->pLeft);.  af
7f10: 66 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  f2 = sqlite3Expr
7f20: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
7f30: 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 61  pRight);.  if( a
7f40: 66 66 31 21 3d 61 66 66 32 0a 20 20 20 26 26 20  ff1!=aff2.   && 
7f50: 28 21 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  (!sqlite3IsNumer
7f60: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
7f70: 20 7c 7c 20 21 73 71 6c 69 74 65 33 49 73 4e 75   || !sqlite3IsNu
7f80: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
7f90: 66 32 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  f2)).  ){.    re
7fa0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43  turn 0;.  }.  pC
7fb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
7fc0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
7fd0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
7fe0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
7ff0: 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 70 43  Right);.  if( pC
8000: 6f 6c 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  oll==0 || sqlite
8010: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
8020: 7a 4e 61 6d 65 2c 20 22 42 49 4e 41 52 59 22 29  zName, "BINARY")
8030: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
8040: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8050: 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68  ExprCollSeqMatch
8060: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8070: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
8080: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
8090: 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  Recursively walk
80a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
80b0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
80c0: 74 65 6d 65 6e 74 20 61 6e 64 20 67 65 6e 65 72  tement and gener
80d0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
80e0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
80f0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
8100: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
8110: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
8120: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
8130: 65 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28  exprSelectUsage(
8140: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
8150: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
8160: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
8170: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ask = 0;.  while
8180: 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c  ( pS ){.    SrcL
8190: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e  ist *pSrc = pS->
81a0: 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pSrc;.    mask |
81b0: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
81c0: 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
81d0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
81e0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73  );.    mask |= s
81f0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
8200: 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
8210: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
8220: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71  ;.    mask |= sq
8230: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
8240: 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
8250: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
8260: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c  .    mask |= sql
8270: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
8280: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
8290: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
82a0: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  sk |= sqlite3Whe
82b0: 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73  reExprUsage(pMas
82c0: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
82d0: 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  g);.    if( ALWA
82e0: 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20  YS(pSrc!=0) ){. 
82f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
8300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8310: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
8320: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
8330: 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28 70  xprSelectUsage(p
8340: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
8350: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
8360: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71        mask |= sq
8370: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
8380: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
8390: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  rc->a[i].pOn);. 
83a0: 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d         if( pSrc-
83b0: 3e 61 5b 69 5d 2e 66 67 2e 69 73 54 61 62 46 75  >a[i].fg.isTabFu
83c0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
83d0: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57  mask |= sqlite3W
83e0: 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
83f0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
8400: 2d 3e 61 5b 69 5d 2e 75 31 2e 70 46 75 6e 63 41  ->a[i].u1.pFuncA
8410: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rg);.        }. 
8420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8430: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
8440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
8450: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ask;.}../*.** Ex
8460: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
8470: 73 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66  s one operand of
8480: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
8490: 65 72 61 74 6f 72 20 74 68 61 74 20 6d 69 67 68  erator that migh
84a0: 74 0a 2a 2a 20 62 65 20 75 73 65 66 75 6c 20 66  t.** be useful f
84b0: 6f 72 20 69 6e 64 65 78 69 6e 67 2e 20 20 54 68  or indexing.  Th
84c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
84d0: 73 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  s to see if pExp
84e0: 72 20 61 70 70 65 61 72 73 0a 2a 2a 20 69 6e 20  r appears.** in 
84f0: 61 6e 79 20 69 6e 64 65 78 2e 20 20 52 65 74 75  any index.  Retu
8500: 72 6e 20 54 52 55 45 20 28 31 29 20 69 66 20 70  rn TRUE (1) if p
8510: 45 78 70 72 20 69 73 20 61 6e 20 69 6e 64 65 78  Expr is an index
8520: 65 64 20 74 65 72 6d 20 61 6e 64 20 72 65 74 75  ed term and retu
8530: 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 28 30 29 20  rn.** FALSE (0) 
8540: 69 66 20 6e 6f 74 2e 20 20 49 66 20 54 52 55 45  if not.  If TRUE
8550: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 61 6c   is returned, al
8560: 73 6f 20 73 65 74 20 61 69 43 75 72 43 6f 6c 5b  so set aiCurCol[
8570: 30 5d 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  0] to the cursor
8580: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  .** number of th
8590: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
85a0: 69 6e 64 65 78 65 64 20 61 6e 64 20 61 69 43 75  indexed and aiCu
85b0: 72 43 6f 6c 5b 31 5d 20 74 6f 20 74 68 65 20 63  rCol[1] to the c
85c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20  olumn number.** 
85d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68  of the column th
85e0: 61 74 20 69 73 20 69 6e 64 65 78 65 64 2c 20 6f  at is indexed, o
85f0: 72 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  r XN_EXPR (-2) i
8600: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8610: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 69 6e 64 65  is being.** inde
8620: 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  xed..**.** If pE
8630: 78 70 72 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55  xpr is a TK_COLU
8640: 4d 4e 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65  MN column refere
8650: 6e 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  nce, then this r
8660: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65  outine always re
8670: 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 65 76  turns.** true ev
8680: 65 6e 20 69 66 20 74 68 61 74 20 70 61 72 74 69  en if that parti
8690: 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 73 20  cular column is 
86a0: 6e 6f 74 20 69 6e 64 65 78 65 64 2c 20 62 65 63  not indexed, bec
86b0: 61 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  ause the column.
86c0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 64 64 65  ** might be adde
86d0: 64 20 74 6f 20 61 6e 20 61 75 74 6f 6d 61 74 69  d to an automati
86e0: 63 20 69 6e 64 65 78 20 6c 61 74 65 72 2e 0a 2a  c index later..*
86f0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8700: 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 65 78 70  NOINLINE int exp
8710: 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 32  rMightBeIndexed2
8720: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72  (.  SrcList *pFr
8730: 6f 6d 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  om,        /* Th
8740: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
8750: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
8760: 65 71 2c 20 20 20 20 20 20 20 2f 2a 20 42 69 74  eq,       /* Bit
8770: 6d 61 73 6b 20 6f 66 20 46 52 4f 4d 20 63 6c 61  mask of FROM cla
8780: 75 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 65  use terms refere
8790: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
87a0: 0a 20 20 69 6e 74 20 2a 61 69 43 75 72 43 6f 6c  .  int *aiCurCol
87b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
87c0: 74 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  te the reference
87d0: 64 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 61  d table cursor a
87e0: 6e 64 20 63 6f 6c 75 6d 6e 20 68 65 72 65 20 2a  nd column here *
87f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
8800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
8810: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f   operand of a co
8820: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
8830: 72 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  r */.){.  Index 
8840: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pIdx;.  int i;.
8850: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 66 6f    int iCur;.  fo
8860: 72 28 69 3d 30 3b 20 6d 50 72 65 72 65 71 3e 31  r(i=0; mPrereq>1
8870: 3b 20 69 2b 2b 2c 20 6d 50 72 65 72 65 71 3e 3e  ; i++, mPrereq>>
8880: 3d 31 29 7b 7d 0a 20 20 69 43 75 72 20 3d 20 70  =1){}.  iCur = p
8890: 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  From->a[i].iCurs
88a0: 6f 72 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  or;.  for(pIdx=p
88b0: 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  From->a[i].pTab-
88c0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
88d0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
88e0: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
88f0: 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 63 6f  aColExpr==0 ) co
8900: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
8910: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
8920: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
8930: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
8940: 6c 75 6d 6e 5b 69 5d 21 3d 58 4e 5f 45 58 50 52  lumn[i]!=XN_EXPR
8950: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8960: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
8970: 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45  prCompareSkip(pE
8980: 78 70 72 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  xpr, pIdx->aColE
8990: 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  xpr->a[i].pExpr,
89a0: 20 69 43 75 72 29 3d 3d 30 20 29 7b 0a 20 20 20   iCur)==0 ){.   
89b0: 20 20 20 20 20 61 69 43 75 72 43 6f 6c 5b 30 5d       aiCurCol[0]
89c0: 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 20   = iCur;.       
89d0: 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 3d 20 58   aiCurCol[1] = X
89e0: 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 20 20  N_EXPR;.        
89f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
8a00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8a10: 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61 74 69 63  turn 0;.}.static
8a20: 20 69 6e 74 20 65 78 70 72 4d 69 67 68 74 42 65   int exprMightBe
8a30: 49 6e 64 65 78 65 64 28 0a 20 20 53 72 63 4c 69  Indexed(.  SrcLi
8a40: 73 74 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20  st *pFrom,      
8a50: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
8a60: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
8a70: 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20  k mPrereq,      
8a80: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 46   /* Bitmask of F
8a90: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
8aa0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70   referenced by p
8ab0: 45 78 70 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  Expr */.  int *a
8ac0: 69 43 75 72 43 6f 6c 2c 20 20 20 20 20 20 20 20  iCurCol,        
8ad0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
8ae0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 63  ferenced table c
8af0: 75 72 73 6f 72 20 26 20 63 6f 6c 75 6d 6e 20 68  ursor & column h
8b00: 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ere */.  Expr *p
8b10: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
8b20: 2f 2a 20 41 6e 20 6f 70 65 72 61 6e 64 20 6f 66  /* An operand of
8b30: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
8b40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
8b50: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
8b60: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
8b70: 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ic comparison op
8b80: 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2f  erator */.){.  /
8b90: 2a 20 49 66 20 74 68 69 73 20 65 78 70 72 65 73  * If this expres
8ba0: 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
8bb0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 72 20   to the left or 
8bc0: 72 69 67 68 74 20 6f 66 20 61 20 0a 20 20 2a 2a  right of a .  **
8bd0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
8be0: 74 72 61 69 6e 74 20 28 3e 2c 20 3c 2c 20 3e 3d  traint (>, <, >=
8bf0: 20 6f 72 20 3c 3d 29 2c 20 70 65 72 66 6f 72 6d   or <=), perform
8c00: 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
8c10: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 72  .  ** on the fir
8c20: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  st element of th
8c30: 65 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20  e vector.  */.  
8c40: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 2b 31 3d  assert( TK_GT+1=
8c50: 3d 54 4b 5f 4c 45 20 26 26 20 54 4b 5f 47 54 2b  =TK_LE && TK_GT+
8c60: 32 3d 3d 54 4b 5f 4c 54 20 26 26 20 54 4b 5f 47  2==TK_LT && TK_G
8c70: 54 2b 33 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  T+3==TK_GE );.  
8c80: 61 73 73 65 72 74 28 20 54 4b 5f 49 53 3c 54 4b  assert( TK_IS<TK
8c90: 5f 47 45 20 26 26 20 54 4b 5f 49 53 4e 55 4c 4c  _GE && TK_ISNULL
8ca0: 3c 54 4b 5f 47 45 20 26 26 20 54 4b 5f 49 4e 3c  <TK_GE && TK_IN<
8cb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
8cc0: 74 28 20 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  t( op<=TK_GE );.
8cd0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
8ce0: 3d 54 4b 5f 56 45 43 54 4f 52 20 26 26 20 28 6f  =TK_VECTOR && (o
8cf0: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 41 4c 57 41  p>=TK_GT && ALWA
8d00: 59 53 28 6f 70 3c 3d 54 4b 5f 47 45 29 29 20 29  YS(op<=TK_GE)) )
8d10: 7b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45  {.    pExpr = pE
8d20: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
8d30: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  0].pExpr;.  }.. 
8d40: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
8d50: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
8d60: 20 61 69 43 75 72 43 6f 6c 5b 30 5d 20 3d 20 70   aiCurCol[0] = p
8d70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
8d80: 20 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 3d 20    aiCurCol[1] = 
8d90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
8da0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8db0: 7d 0a 20 20 69 66 28 20 6d 50 72 65 72 65 71 3d  }.  if( mPrereq=
8dc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8de0: 2a 20 4e 6f 20 74 61 62 6c 65 20 72 65 66 65 72  * No table refer
8df0: 65 6e 63 65 73 20 2a 2f 0a 20 20 69 66 28 20 28  ences */.  if( (
8e00: 6d 50 72 65 72 65 71 26 28 6d 50 72 65 72 65 71  mPrereq&(mPrereq
8e10: 2d 31 29 29 21 3d 30 20 29 20 72 65 74 75 72 6e  -1))!=0 ) return
8e20: 20 30 3b 20 20 20 2f 2a 20 52 65 66 73 20 6d 6f   0;   /* Refs mo
8e30: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
8e40: 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 78  e */.  return ex
8e50: 70 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64  prMightBeIndexed
8e60: 32 28 70 46 72 6f 6d 2c 6d 50 72 65 72 65 71 2c  2(pFrom,mPrereq,
8e70: 61 69 43 75 72 43 6f 6c 2c 70 45 78 70 72 29 3b  aiCurCol,pExpr);
8e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  .}../*.** The in
8e90: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
8ea0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
8eb0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
8ec0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
8ed0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
8ee0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
8ef0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
8f00: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
8f10: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
8f20: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
8f30: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
8f40: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
8f50: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
8f60: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
8f70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8f80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
8f90: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
8fa0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
8fb0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
8fc0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
8fd0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
8fe0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8ff0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
9000: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
9010: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
9020: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
9030: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
9040: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
9050: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
9060: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
9070: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
9080: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
9090: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
90a0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
90b0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
90c0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
90d0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
90e0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
90f0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
9100: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
9110: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
9120: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
9130: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
9140: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
9150: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
9160: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
9170: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
9180: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
9190: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
91a0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
91b0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
91c0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
91d0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
91e0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
91f0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
9200: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
9210: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9220: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
9230: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
9240: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
9250: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
9260: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
9270: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
9280: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
9290: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
92a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
92b0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
92c0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
92d0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
92e0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
92f0: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
9300: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
9310: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
9320: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
9330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9340: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
9350: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
9360: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
9370: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
9380: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
9390: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
93a0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93c0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
93d0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
93e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
93f0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
9400: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
9410: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
9420: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
9430: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
9440: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9450: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
9460: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
9470: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
9480: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
9490: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
94a0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
94b0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
94c0: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
94d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
94e0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
94f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
9500: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9520: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
9530: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
9540: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
9550: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
9560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 70 70            /* upp
9570: 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  ercase equivalen
9580: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
9590: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
95c0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
95d0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
95e0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
95f0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
9600: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9610: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9620: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9630: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9650: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9660: 65 4f 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20  eOp2 = 0;       
9670: 20 20 20 2f 2a 20 6f 70 32 20 76 61 6c 75 65 20     /* op2 value 
9680: 66 6f 72 20 4c 49 4b 45 2f 52 45 47 45 58 50 2f  for LIKE/REGEXP/
9690: 47 4c 4f 42 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  GLOB */.  int nL
96a0: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
96b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
96c0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
96d0: 20 6f 6e 20 6c 65 66 74 20 73 69 64 65 20 76 65   on left side ve
96e0: 63 74 6f 72 20 2a 2f 0a 0a 20 20 69 66 28 20 64  ctor */..  if( d
96f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9710: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9720: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9730: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9740: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9750: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9760: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9770: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9780: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9790: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
97a0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 73 71 6c  prereqLeft = sql
97b0: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
97c0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
97d0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
97e0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
97f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
9800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
9810: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
9820: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9830: 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
9840: 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
9850: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 45 78 70  urn;.    if( Exp
9860: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
9870: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
9880: 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  ) ){.      pTerm
9890: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
98a0: 65 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28  exprSelectUsage(
98b0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
98c0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
98d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
98e0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
98f0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
9900: 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
9910: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
9920: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
9930: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
9940: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
9950: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9960: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
9970: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9980: 71 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  qRight = sqlite3
9990: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70  WhereExprUsage(p
99a0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
99b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
99c0: 4d 61 73 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c  MaskSet->bVarSel
99d0: 65 63 74 20 3d 20 30 3b 0a 20 20 70 72 65 72 65  ect = 0;.  prere
99e0: 71 41 6c 6c 20 3d 20 73 71 6c 69 74 65 33 57 68  qAll = sqlite3Wh
99f0: 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61  ereExprUsage(pMa
9a00: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
9a10: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 62   if( pMaskSet->b
9a20: 56 61 72 53 65 6c 65 63 74 20 29 20 70 54 65 72  VarSelect ) pTer
9a30: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
9a40: 52 4d 5f 56 41 52 53 45 4c 45 43 54 3b 0a 20 20  RM_VARSELECT;.  
9a50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9a60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
9a70: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
9a80: 69 74 6d 61 73 6b 20 78 20 3d 20 73 71 6c 69 74  itmask x = sqlit
9a90: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
9aa0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9ab0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
9ac0: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
9ad0: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
9ae0: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
9af0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
9b00: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
9b10: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
9b40: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
9b50: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
9b60: 30 31 35 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  015 */.    if( (
9b70: 70 72 65 72 65 71 41 6c 6c 3e 3e 31 29 3e 3d 78  prereqAll>>1)>=x
9b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9b90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9ba0: 2c 20 22 4f 4e 20 63 6c 61 75 73 65 20 72 65 66  , "ON clause ref
9bb0: 65 72 65 6e 63 65 73 20 74 61 62 6c 65 73 20 74  erences tables t
9bc0: 6f 20 69 74 73 20 72 69 67 68 74 22 29 3b 0a 20  o its right");. 
9bd0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9be0: 20 7d 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e   }.  }.  pTerm->
9bf0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
9c00: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
9c10: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
9c20: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
9c30: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
9c40: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
9c50: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
9c60: 6f 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  op) ){.    int a
9c70: 69 43 75 72 43 6f 6c 5b 32 5d 3b 0a 20 20 20 20  iCurCol[2];.    
9c80: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
9c90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
9ca0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
9cb0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
9cc0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9cd0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
9ce0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9cf0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
9d00: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9d10: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
9d20: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
9d30: 4f 5f 45 51 55 49 56 3b 0a 0a 20 20 20 20 69 66  O_EQUIV;..    if
9d40: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 3e  ( pTerm->iField>
9d50: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
9d60: 74 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  t( op==TK_IN );.
9d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9d80: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  eft->op==TK_VECT
9d90: 4f 52 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 66  OR );.      pLef
9da0: 74 20 3d 20 70 4c 65 66 74 2d 3e 78 2e 70 4c 69  t = pLeft->x.pLi
9db0: 73 74 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 46 69  st->a[pTerm->iFi
9dc0: 65 6c 64 2d 31 5d 2e 70 45 78 70 72 3b 0a 20 20  eld-1].pExpr;.  
9dd0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 78 70    }..    if( exp
9de0: 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 28  rMightBeIndexed(
9df0: 70 53 72 63 2c 20 70 72 65 72 65 71 4c 65 66 74  pSrc, prereqLeft
9e00: 2c 20 61 69 43 75 72 43 6f 6c 2c 20 70 4c 65 66  , aiCurCol, pLef
9e10: 74 2c 20 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  t, op) ){.      
9e20: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
9e30: 72 20 3d 20 61 69 43 75 72 43 6f 6c 5b 30 5d 3b  r = aiCurCol[0];
9e40: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
9e50: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 61 69 43  leftColumn = aiC
9e60: 75 72 43 6f 6c 5b 31 5d 3b 0a 20 20 20 20 20 20  urCol[1];.      
9e70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9e80: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
9e90: 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  op) & opMask;.  
9ea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
9eb0: 54 4b 5f 49 53 20 29 20 70 54 65 72 6d 2d 3e 77  TK_IS ) pTerm->w
9ec0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 49  tFlags |= TERM_I
9ed0: 53 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  S;.    if( pRigh
9ee0: 74 20 0a 20 20 20 20 20 26 26 20 65 78 70 72 4d  t .     && exprM
9ef0: 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 70 53  ightBeIndexed(pS
9f00: 72 63 2c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  rc, pTerm->prere
9f10: 71 52 69 67 68 74 2c 20 61 69 43 75 72 43 6f 6c  qRight, aiCurCol
9f20: 2c 20 70 52 69 67 68 74 2c 20 6f 70 29 0a 20 20  , pRight, op).  
9f30: 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
9f40: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
9f50: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
9f60: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70      u16 eExtraOp
9f70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
9f80: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70  Extra bits for p
9f90: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  New->eOperator *
9fa0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9fb0: 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 3d 3d 30  pTerm->iField==0
9fc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
9fd0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
9fe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
9ff0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
a000: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
a010: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
a020: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
a030: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a040: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
a050: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a060: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
a070: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
a080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a090: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
a0a0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
a0b0: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
a0c0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
a0d0: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
a0e0: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
a0f0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
a100: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
a110: 77 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b  w];.        mark
a120: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
a130: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
a140: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
a150: 70 3d 3d 54 4b 5f 49 53 20 29 20 70 4e 65 77 2d  p==TK_IS ) pNew-
a160: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
a170: 5f 49 53 3b 0a 20 20 20 20 20 20 20 20 70 54 65  _IS;.        pTe
a180: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
a190: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
a1a0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
a1b0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 0a 20   TERM_COPIED;.. 
a1c0: 20 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 49         if( termI
a1d0: 73 45 71 75 69 76 61 6c 65 6e 63 65 28 70 50 61  sEquivalence(pPa
a1e0: 72 73 65 2c 20 70 44 75 70 29 20 29 7b 0a 20 20  rse, pDup) ){.  
a1f0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65          pTerm->e
a200: 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45  Operator |= WO_E
a210: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20  QUIV;.          
a220: 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51  eExtraOp = WO_EQ
a230: 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  UIV;.        }. 
a240: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a250: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
a260: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
a270: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
a280: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
a290: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b  e(pParse, pDup);
a2a0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66  .      pNew->lef
a2b0: 74 43 75 72 73 6f 72 20 3d 20 61 69 43 75 72 43  tCursor = aiCurC
a2c0: 6f 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4e 65  ol[0];.      pNe
a2d0: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
a2e0: 3d 20 61 69 43 75 72 43 6f 6c 5b 31 5d 3b 0a 20  = aiCurCol[1];. 
a2f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
a300: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a310: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
a320: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
a330: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
a340: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
a350: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
a360: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
a370: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
a380: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
a390: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
a3a0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
a3b0: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
a3c0: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
a3d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3e0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
a3f0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
a400: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
a410: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
a420: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
a430: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
a440: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
a450: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
a460: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
a470: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
a480: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
a490: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
a4a0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
a4b0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
a4c0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a4d0: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
a4e0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
a4f0: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
a500: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
a510: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
a520: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
a530: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
a540: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
a550: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
a560: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
a570: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
a580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
a590: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
a5a0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
a5b0: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
a5c0: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
a5d0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
a5e0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
a5f0: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
a600: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
a610: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
a620: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
a630: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
a640: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a650: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a660: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
a670: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
a680: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
a690: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a6a0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
a6b0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
a6c0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
a6d0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
a6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a6f0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
a700: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a710: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
a720: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
a730: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
a740: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
a750: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
a760: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
a770: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
a780: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a7b0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
a7c0: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a7f0: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
a800: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 29 3b  a[i].pExpr, 0));
a810: 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a  .      transferJ
a820: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
a830: 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
a840: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
a850: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
a860: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
a870: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a880: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a890: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
a8a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
a8b0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
a8c0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
a8d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a8e0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a8f0: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69     markTermAsChi
a900: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20  ld(pWC, idxNew, 
a910: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  idxTerm);.    }.
a920: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
a930: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
a940: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
a950: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
a960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
a970: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
a980: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a990: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
a9a0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
a9b0: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
a9c0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
a9d0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
a9e0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
a9f0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
aa00: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
aa10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
aa20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
aa30: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
aa40: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
aa50: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
aa60: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
aa70: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
aa80: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
aa90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aaa0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
aab0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
aac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
aad0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
aae0: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
aaf0: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
ab00: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
ab10: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
ab20: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
ab30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
ab40: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
ab50: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 42 63  orm "x LIKE 'aBc
ab60: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
ab70: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
ab80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
ab90: 20 20 20 78 3e 3d 27 41 42 43 27 20 41 4e 44 20     x>='ABC' AND 
aba0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
abb0: 4b 45 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a 20  KE 'aBc%'.  **. 
abc0: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
abd0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
abe0: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
abf0: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
ac00: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
ac10: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
ac20: 20 22 61 62 64 22 2e 20 20 49 66 20 63 61 73 65   "abd".  If case
ac30: 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63   is not signific
ac40: 61 6e 74 20 28 74 68 65 20 64 65 66 61 75 6c 74  ant (the default
ac50: 0a 20 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29 20  .  ** for LIKE) 
ac60: 74 68 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d 62  then the lower-b
ac70: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c  ound is made all
ac80: 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 74   uppercase and t
ac90: 68 65 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20 62  he upper-.  ** b
aca0: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c  ound is made all
acb0: 20 6c 6f 77 65 72 63 61 73 65 20 73 6f 20 74 68   lowercase so th
acc0: 61 74 20 74 68 65 20 62 6f 75 6e 64 73 20 61 6c  at the bounds al
acd0: 73 6f 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d  so work when com
ace0: 70 61 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f 42  paring.  ** BLOB
acf0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  s..  */.  if( pW
ad00: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
ad10: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
ad20: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
ad30: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
ad40: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
ad50: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
ad60: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
ad70: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
ad80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
ad90: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
ada0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
adb0: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
adc0: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
add0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
ade0: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
adf0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
ae00: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
ae10: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
ae20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
ae30: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 20 20 20  ollSeqName;     
ae40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
ae50: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
ae60: 0a 20 20 20 20 63 6f 6e 73 74 20 75 31 36 20 77  .    const u16 w
ae70: 74 46 6c 61 67 73 20 3d 20 54 45 52 4d 5f 4c 49  tFlags = TERM_LI
ae80: 4b 45 4f 50 54 20 7c 20 54 45 52 4d 5f 56 49 52  KEOPT | TERM_VIR
ae90: 54 55 41 4c 20 7c 20 54 45 52 4d 5f 44 59 4e 41  TUAL | TERM_DYNA
aea0: 4d 49 43 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20  MIC;..    pLeft 
aeb0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
aec0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
aed0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
aee0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
aef0: 72 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  r1, 0);..    /* 
af00: 43 6f 6e 76 65 72 74 20 74 68 65 20 6c 6f 77 65  Convert the lowe
af10: 72 20 62 6f 75 6e 64 20 74 6f 20 75 70 70 65 72  r bound to upper
af20: 2d 63 61 73 65 20 61 6e 64 20 74 68 65 20 75 70  -case and the up
af30: 70 65 72 20 62 6f 75 6e 64 20 74 6f 0a 20 20 20  per bound to.   
af40: 20 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 28   ** lower-case (
af50: 75 70 70 65 72 2d 63 61 73 65 20 69 73 20 6c 65  upper-case is le
af60: 73 73 20 74 68 61 6e 20 6c 6f 77 65 72 2d 63 61  ss than lower-ca
af70: 73 65 20 69 6e 20 41 53 43 49 49 29 20 73 6f 20  se in ASCII) so 
af80: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
af90: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
afa0: 73 20 61 6c 73 6f 20 77 6f 72 6b 20 66 6f 72 20  s also work for 
afb0: 42 4c 4f 42 73 0a 20 20 20 20 2a 2f 0a 20 20 20  BLOBs.    */.   
afc0: 20 69 66 28 20 6e 6f 43 61 73 65 20 26 26 20 21   if( noCase && !
afd0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
afe0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
aff0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
b000: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 70 54 65  har c;.      pTe
b010: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
b020: 45 52 4d 5f 4c 49 4b 45 3b 0a 20 20 20 20 20 20  ERM_LIKE;.      
b030: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 53  for(i=0; (c = pS
b040: 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d  tr1->u.zToken[i]
b050: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
b060: 20 20 20 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f      pStr1->u.zTo
b070: 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  ken[i] = sqlite3
b080: 54 6f 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20  Toupper(c);.    
b090: 20 20 20 20 70 53 74 72 32 2d 3e 75 2e 7a 54 6f      pStr2->u.zTo
b0a0: 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  ken[i] = sqlite3
b0b0: 54 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20  Tolower(c);.    
b0c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
b0d0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b0e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38  iled ){.      u8
b0f0: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f   c, *pC;       /
b100: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72  * Last character
b110: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b120: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  t wildcard */.  
b130: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
b140: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73  Str2->u.zToken[s
b150: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b160: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d  Str2->u.zToken)-
b170: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70  1];.      c = *p
b180: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  C;.      if( noC
b190: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ase ){.        /
b1a0: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74  * The point is t
b1b0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
b1c0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  last character b
b1d0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
b1e0: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63          ** wildc
b1f0: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20  ard.  But if we 
b200: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74  increment '@', t
b210: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74  hat will push it
b220: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
b230: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20    ** alphabetic 
b240: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65  range where case
b250: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c   conversions wil
b260: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20  l mess up the . 
b270: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61         ** inequa
b280: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20  lity.  To avoid 
b290: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  this, make sure 
b2a0: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20  to also run the 
b2b0: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  full.        ** 
b2c0: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64  LIKE on all cand
b2d0: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
b2e0: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  s by clearing th
b2f0: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61  e isComplete fla
b300: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  g.        */.   
b310: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d       if( c=='A'-
b320: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  1 ) isComplete =
b330: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
b340: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
b350: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
b360: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
b370: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  1;.    }.    zCo
b380: 6c 6c 53 65 71 4e 61 6d 65 20 3d 20 6e 6f 43 61  llSeqName = noCa
b390: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
b3a0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 70 4e  "BINARY";.    pN
b3b0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b3c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b3d0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b3e0: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b3f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b400: 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  GE,.           s
b410: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
b420: 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
b430: 65 2c 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f 6c  e,pNewExpr1,zCol
b440: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
b450: 20 20 20 20 20 20 70 53 74 72 31 29 3b 0a 20 20        pStr1);.  
b460: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
b470: 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31  rkings(pNewExpr1
b480: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64  , pExpr);.    id
b490: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
b4a0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
b4b0: 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61 67  NewExpr1, wtFlag
b4c0: 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  s);.    testcase
b4d0: 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a  ( idxNew1==0 );.
b4e0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b4f0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b500: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
b510: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b520: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b530: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b540: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b550: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
b560: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b570: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
b580: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e 65  tring(pParse,pNe
b590: 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71 4e  wExpr2,zCollSeqN
b5a0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
b5b0: 20 70 53 74 72 32 29 3b 0a 20 20 20 20 74 72 61   pStr2);.    tra
b5c0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
b5d0: 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78  s(pNewExpr2, pEx
b5e0: 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32  pr);.    idxNew2
b5f0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
b600: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
b610: 70 72 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20  pr2, wtFlags);. 
b620: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b630: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
b640: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b650: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
b660: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b670: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b680: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
b690: 20 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65   ){.      markTe
b6a0: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69  rmAsChild(pWC, i
b6b0: 64 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29  dxNew1, idxTerm)
b6c0: 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d  ;.      markTerm
b6d0: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
b6e0: 4e 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a  New2, idxTerm);.
b6f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b710: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
b720: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
b730: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
b740: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20  LTABLE.  /* Add 
b750: 61 20 57 4f 5f 41 55 58 20 61 75 78 69 6c 69 61  a WO_AUX auxilia
b760: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
b770: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
b780: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
b790: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
b7a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
b7b0: 75 6d 6e 20 4f 50 20 65 78 70 72 22 20 77 68 65  umn OP expr" whe
b7c0: 72 65 20 4f 50 0a 20 20 2a 2a 20 69 73 20 61 6e  re OP.  ** is an
b7d0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 67   operator that g
b7e0: 65 74 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ets passed into 
b7f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 62  virtual tables b
b800: 75 74 20 77 68 69 63 68 20 69 73 0a 20 20 2a 2a  ut which is.  **
b810: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 6f 70   not normally op
b820: 74 69 6d 69 7a 65 64 20 66 6f 72 20 6f 72 64 69  timized for ordi
b830: 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e  nary tables.  In
b840: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 4f 50   other words, OP
b850: 0a 20 20 2a 2a 20 69 73 20 6f 6e 65 20 6f 66 20  .  ** is one of 
b860: 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f  MATCH, LIKE, GLO
b870: 42 2c 20 52 45 47 45 58 50 2c 20 21 3d 2c 20 49  B, REGEXP, !=, I
b880: 53 2c 20 49 53 20 4e 4f 54 2c 20 6f 72 20 4e 4f  S, IS NOT, or NO
b890: 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 54 68 69  T NULL..  ** Thi
b8a0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
b8b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
b8c0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
b8d0: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
b8e0: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
b8f0: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
b900: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
b910: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
b920: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
b930: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
b940: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
b950: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
b960: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
b970: 30 2c 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  0, *pLeft = 0;. 
b980: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 69 73 41     int res = isA
b990: 75 78 69 6c 69 61 72 79 56 74 61 62 4f 70 65 72  uxiliaryVtabOper
b9a0: 61 74 6f 72 28 70 45 78 70 72 2c 20 26 65 4f 70  ator(pExpr, &eOp
b9b0: 32 2c 20 26 70 4c 65 66 74 2c 20 26 70 52 69 67  2, &pLeft, &pRig
b9c0: 68 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ht);.    while( 
b9d0: 72 65 73 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  res-- > 0 ){.   
b9e0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b9f0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
ba00: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 20 20  pNewTerm;.      
ba10: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
ba20: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
ba30: 3b 0a 0a 20 20 20 20 20 20 70 72 65 72 65 71 45  ;..      prereqE
ba40: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 57 68 65  xpr = sqlite3Whe
ba50: 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73  reExprUsage(pMas
ba60: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
ba70: 20 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d       prereqColum
ba80: 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
ba90: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53  ExprUsage(pMaskS
baa0: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
bab0: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
bac0: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
bad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
bae0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
baf0: 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72          pNewExpr
bb00: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bb10: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
bb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  , .            0
bb30: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
bb40: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 29  (db, pRight, 0))
bb50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
bb60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
bb70: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
bb80: 29 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  ) && pNewExpr ){
bb90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
bba0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 45  etProperty(pNewE
bbb0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
bbc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bbd0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
bbe0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
bbf0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
bc00: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
bc10: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
bc20: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
bc30: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
bc40: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
bc50: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
bc60: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bc70: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
bc80: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
bc90: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
bca0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
bcb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
bcc0: 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
bcd0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
bce0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
bcf0: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
bd00: 61 74 6f 72 20 3d 20 57 4f 5f 41 55 58 3b 0a 20  ator = WO_AUX;. 
bd10: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d         pNewTerm-
bd20: 3e 65 4d 61 74 63 68 4f 70 20 3d 20 65 4f 70 32  >eMatchOp = eOp2
bd30: 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54 65  ;.        markTe
bd40: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69  rmAsChild(pWC, i
bd50: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b  dxNew, idxTerm);
bd60: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
bd70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
bd80: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
bd90: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
bda0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
bdb0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
bdc0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
bdd0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
bde0: 7d 0a 20 20 20 20 20 20 53 57 41 50 28 45 78 70  }.      SWAP(Exp
bdf0: 72 2a 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  r*, pLeft, pRigh
be00: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
be10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
be20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
be30: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
be40: 72 65 20 69 73 20 61 20 76 65 63 74 6f 72 20 3d  re is a vector =
be50: 3d 20 6f 72 20 49 53 20 74 65 72 6d 20 2d 20 65  = or IS term - e
be60: 2e 67 2e 20 22 28 61 2c 20 62 29 20 3d 3d 20 28  .g. "(a, b) == (
be70: 3f 2c 20 3f 29 22 20 2d 20 63 72 65 61 74 65 0a  ?, ?)" - create.
be80: 20 20 2a 2a 20 6e 65 77 20 74 65 72 6d 73 20 66    ** new terms f
be90: 6f 72 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  or each componen
bea0: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2d 20 22  t comparison - "
beb0: 61 20 3d 20 3f 22 20 61 6e 64 20 22 62 20 3d 20  a = ?" and "b = 
bec0: 3f 22 2e 20 20 54 68 65 0a 20 20 2a 2a 20 6e 65  ?".  The.  ** ne
bed0: 77 20 74 65 72 6d 73 20 63 6f 6d 70 6c 65 74 65  w terms complete
bee0: 6c 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  ly replace the o
bef0: 72 69 67 69 6e 61 6c 20 76 65 63 74 6f 72 20 63  riginal vector c
bf00: 6f 6d 70 61 72 69 73 6f 6e 2c 20 77 68 69 63 68  omparison, which
bf10: 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 6c 6f 6e 67   is.  ** no long
bf20: 65 72 20 75 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  er used..  **.  
bf30: 2a 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  ** This is only 
bf40: 72 65 71 75 69 72 65 64 20 69 66 20 61 74 20 6c  required if at l
bf50: 65 61 73 74 20 6f 6e 65 20 73 69 64 65 20 6f 66  east one side of
bf60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
bf70: 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 69  operation.  ** i
bf80: 73 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  s not a sub-sele
bf90: 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  ct.  */.  if( pW
bfa0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
bfb0: 20 26 26 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   && (pExpr->op==
bfc0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
bfd0: 6f 70 3d 3d 54 4b 5f 49 53 29 0a 20 20 26 26 20  op==TK_IS).  && 
bfe0: 28 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  (nLeft = sqlite3
bff0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
c000: 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 3e 31 0a  Expr->pLeft))>1.
c010: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
c020: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
c030: 2d 3e 70 52 69 67 68 74 29 3d 3d 6e 4c 65 66 74  ->pRight)==nLeft
c040: 0a 20 20 26 26 20 28 20 28 70 45 78 70 72 2d 3e  .  && ( (pExpr->
c050: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
c060: 50 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 20  P_xIsSelect)==0 
c070: 0a 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  .    || (pExpr->
c080: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
c090: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30  EP_xIsSelect)==0
c0a0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ).  ){.    int i
c0b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c0c0: 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nLeft; i++){.  
c0d0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c0e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
c0f0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
c100: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
c110: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
c120: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c130: 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
c140: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73  Expr *pRight = s
c150: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
c160: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
c170: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
c180: 69 29 3b 0a 0a 20 20 20 20 20 20 70 4e 65 77 20  i);..      pNew 
c190: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c1a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6f 70  Parse, pExpr->op
c1b0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
c1c0: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72  ;.      transfer
c1d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
c1e0: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
c1f0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
c200: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c210: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 44 59 4e 41   pNew, TERM_DYNA
c220: 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72  MIC);.      expr
c230: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
c240: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
c250: 7d 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  }.    pTerm = &p
c260: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c270: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c280: 67 73 20 3d 20 54 45 52 4d 5f 43 4f 44 45 44 7c  gs = TERM_CODED|
c290: 54 45 52 4d 5f 56 49 52 54 55 41 4c 3b 20 20 2f  TERM_VIRTUAL;  /
c2a0: 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 6f 72  * Disable the or
c2b0: 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 70 54  iginal */.    pT
c2c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c2d0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
c2e0: 20 74 68 65 72 65 20 69 73 20 61 20 76 65 63 74   there is a vect
c2f0: 6f 72 20 49 4e 20 74 65 72 6d 20 2d 20 65 2e 67  or IN term - e.g
c300: 2e 20 22 28 61 2c 20 62 29 20 49 4e 20 28 53 45  . "(a, b) IN (SE
c310: 4c 45 43 54 20 2e 2e 2e 29 22 20 2d 20 63 72 65  LECT ...)" - cre
c320: 61 74 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  ate.  ** a virtu
c330: 61 6c 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68  al term for each
c340: 20 76 65 63 74 6f 72 20 63 6f 6d 70 6f 6e 65 6e   vector componen
c350: 74 2e 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  t. The expressio
c360: 6e 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 75 73  n object.  ** us
c370: 65 64 20 62 79 20 65 61 63 68 20 73 75 63 68 20  ed by each such 
c380: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 69 73 20  virtual term is 
c390: 70 45 78 70 72 20 28 74 68 65 20 66 75 6c 6c 20  pExpr (the full 
c3a0: 76 65 63 74 6f 72 20 49 4e 28 2e 2e 2e 29 20 0a  vector IN(...) .
c3b0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 29    ** expression)
c3c0: 2e 20 54 68 65 20 57 68 65 72 65 54 65 72 6d 2e  . The WhereTerm.
c3d0: 69 46 69 65 6c 64 20 76 61 72 69 61 62 6c 65 20  iField variable 
c3e0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 69  identifies the i
c3f0: 6e 64 65 78 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ndex within.  **
c400: 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
c410: 68 65 20 4c 48 53 20 74 68 61 74 20 74 68 65 20  he LHS that the 
c420: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 72 65 70  virtual term rep
c430: 72 65 73 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  resents..  **.  
c440: 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  ** This only wor
c450: 6b 73 20 69 66 20 74 68 65 20 52 48 53 20 69 73  ks if the RHS is
c460: 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54   a simple SELECT
c470: 2c 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  , not a compound
c480: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
c490: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70  >op==TK_AND && p
c4a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
c4b0: 26 26 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64  && pTerm->iField
c4c0: 3d 3d 30 0a 20 20 20 26 26 20 70 45 78 70 72 2d  ==0.   && pExpr-
c4d0: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 56  >pLeft->op==TK_V
c4e0: 45 43 54 4f 52 0a 20 20 20 26 26 20 70 45 78 70  ECTOR.   && pExp
c4f0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 50  r->x.pSelect->pP
c500: 72 69 6f 72 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  rior==0.  ){.   
c510: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
c520: 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65 33 45 78  i=0; i<sqlite3Ex
c530: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c540: 70 72 2d 3e 70 4c 65 66 74 29 3b 20 69 2b 2b 29  pr->pLeft); i++)
c550: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  {.      int idxN
c560: 65 77 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  ew;.      idxNew
c570: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c580: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
c590: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3b 0a   TERM_VIRTUAL);.
c5a0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
c5b0: 4e 65 77 5d 2e 69 46 69 65 6c 64 20 3d 20 69 2b  New].iField = i+
c5c0: 31 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61  1;.      exprAna
c5d0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
c5e0: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 6d  idxNew);.      m
c5f0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
c600: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54  WC, idxNew, idxT
c610: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erm);.    }.  }.
c620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c630: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
c640: 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT4.  /* When s
c650: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
c660: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
c670: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
c680: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
c690: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
c6a0: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
c6b0: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
c6c0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
c6d0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
c6e0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
c6f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c700: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
c710: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
c720: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
c730: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
c740: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
c750: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
c760: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
c770: 45 52 4d 5f 56 4e 55 4c 4c 2e 0a 20 20 2a 2f 0a  ERM_VNULL..  */.
c780: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
c790: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
c7a0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
c7b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c7c0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
c7d0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
c7e0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
c7f0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
c800: 45 5f 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20  E_Stat34).  ){. 
c810: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
c820: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
c830: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
c840: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
c850: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
c860: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
c870: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
c880: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c890: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
c8c0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
c8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c8f0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c900: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
c910: 29 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20  ));..    idxNew 
c920: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
c930: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
c940: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c970: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
c980: 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20  VNULL);.    if( 
c990: 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  idxNew ){.      
c9a0: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
c9b0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
c9c0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c9d0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  eqRight = 0;.   
c9e0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
c9f0: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
ca00: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
ca10: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
ca20: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
ca30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
ca40: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
ca50: 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20  r = WO_GT;.     
ca60: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
ca70: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
ca80: 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54  xTerm);.      pT
ca90: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
caa0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
cab0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
cac0: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
cad0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
cae0: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
caf0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
cb00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
cb10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
cb20: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
cb30: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
cb40: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
cb50: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
cb60: 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
cb70: 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
cb80: 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
cb90: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
cba0: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 74 65   join..  */.  te
cbb0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 21 3d 26  stcase( pTerm!=&
cbc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 20  pWC->a[idxTerm] 
cbd0: 29 3b 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57  );.  pTerm = &pW
cbe0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
cbf0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
cc00: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
cc10: 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}../*********
cc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc60: 2a 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 77  **.** Routines w
cc70: 69 74 68 20 66 69 6c 65 20 73 63 6f 70 65 20 61  ith file scope a
cc80: 62 6f 76 65 2e 20 20 49 6e 74 65 72 66 61 63 65  bove.  Interface
cc90: 20 74 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20   to the rest of 
cca0: 74 68 65 20 77 68 65 72 65 2e 63 0a 2a 2a 20 73  the where.c.** s
ccb0: 75 62 73 79 73 74 65 6d 20 66 6f 6c 6c 6f 77 73  ubsystem follows
ccc0: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
ccd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ccf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
cd10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cd20: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
cd30: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
cd40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cd50: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
cd60: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
cd70: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
cd80: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
cd90: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
cda0: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
cdb0: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
cdc0: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
cdd0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
cde0: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
cdf0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
ce00: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
ce10: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
ce20: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
ce30: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
ce40: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
ce50: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
ce60: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
ce70: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
ce80: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
ce90: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
cea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
ceb0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
ced0: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
cee0: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
cef0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
cf00: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
cf10: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
cf20: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
cf30: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
cf40: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
cf50: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
cf60: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
cf70: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
cf80: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
cf90: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
cfa0: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
cfb0: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
cfc0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
cfd0: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
cfe0: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
cff0: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
d000: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
d010: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
d020: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64   clause..*/.void
d030: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
d040: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
d050: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
d060: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 45 78 70 72  , u8 op){.  Expr
d070: 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45   *pE2 = sqlite3E
d080: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
d090: 45 78 70 72 29 3b 0a 20 20 70 57 43 2d 3e 6f 70  Expr);.  pWC->op
d0a0: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 32   = op;.  if( pE2
d0b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d0c0: 69 66 28 20 70 45 32 2d 3e 6f 70 21 3d 6f 70 20  if( pE2->op!=op 
d0d0: 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
d0e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45  seInsert(pWC, pE
d0f0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 0);.  }else
d100: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  {.    sqlite3Whe
d110: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 32  reSplit(pWC, pE2
d120: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
d130: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
d140: 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70 52  lit(pWC, pE2->pR
d150: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
d160: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
d170: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
d180: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
d190: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
d1a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
d1b0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
d1c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
d1d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
d1e0: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
d1f0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
d200: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
d210: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
d220: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63  ERE processing c
d230: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70  ontext */.){.  p
d240: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WC->pWInfo = pWI
d250: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  nfo;.  pWC->pOut
d260: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
d270: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
d280: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
d290: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
d2a0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
d2b0: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
d2c0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
d2d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
d2e0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
d2f0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
d300: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
d310: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
d320: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
d330: 69 6e 76 65 72 73 65 20 6f 66 0a 2a 2a 20 73 71  inverse of.** sq
d340: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
d350: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Init()..*/.void 
d360: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
d370: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
d380: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
d390: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
d3a0: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
d3b0: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
d3c0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
d3d0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
d3e0: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
d3f0: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
d400: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
d410: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
d420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d430: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
d440: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
d450: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
d460: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
d470: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
d480: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
d490: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
d4a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
d4b0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
d4c0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
d4d0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
d4e0: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
d4f0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
d500: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
d510: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
d520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d530: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
d540: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  }.}.../*.** Thes
d550: 65 20 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20  e routines walk 
d560: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
d570: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
d580: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a   and generate.**
d590: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
d5a0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
d5b0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
d5c0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
d5d0: 2a 20 74 72 65 65 2e 0a 2a 2f 0a 42 69 74 6d 61  * tree..*/.Bitma
d5e0: 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  sk sqlite3WhereE
d5f0: 78 70 72 55 73 61 67 65 28 57 68 65 72 65 4d 61  xprUsage(WhereMa
d600: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
d610: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
d620: 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69 66 28  mask mask;.  if(
d630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
d640: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
d650: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
d660: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 57 68  return sqlite3Wh
d670: 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
d680: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
d690: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 28 70  .  }.  mask = (p
d6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c  ->op==TK_IF_NULL
d6b0: 5f 52 4f 57 29 20 3f 20 73 71 6c 69 74 65 33 57  _ROW) ? sqlite3W
d6c0: 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73  hereGetMask(pMas
d6d0: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
d6e0: 20 3a 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   : 0;.  assert( 
d6f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
d700: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
d710: 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  ) );.  if( p->pL
d720: 65 66 74 20 29 20 6d 61 73 6b 20 7c 3d 20 73 71  eft ) mask |= sq
d730: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
d740: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
d750: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
d760: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
d770: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57  mask |= sqlite3W
d780: 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d  hereExprUsage(pM
d790: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
d7a0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
d7b0: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b  p->x.pList==0 );
d7c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
d7d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
d7e0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
d7f0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
d800: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 56  Property(p, EP_V
d810: 61 72 53 65 6c 65 63 74 29 20 29 20 70 4d 61 73  arSelect) ) pMas
d820: 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c 65 63 74  kSet->bVarSelect
d830: 20 3d 20 31 3b 0a 20 20 20 20 6d 61 73 6b 20 7c   = 1;.    mask |
d840: 3d 20 65 78 70 72 53 65 6c 65 63 74 55 73 61 67  = exprSelectUsag
d850: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
d860: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c  .pSelect);.  }el
d870: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
d880: 74 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  t ){.    mask |=
d890: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
d8a0: 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
d8b0: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  Set, p->x.pList)
d8c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
d8d0: 61 73 6b 3b 0a 7d 0a 42 69 74 6d 61 73 6b 20 73  ask;.}.Bitmask s
d8e0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
d8f0: 69 73 74 55 73 61 67 65 28 57 68 65 72 65 4d 61  istUsage(WhereMa
d900: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
d910: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d920: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69  ){.  int i;.  Bi
d930: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
d940: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d950: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
d960: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d970: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
d980: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
d990: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
d9a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
d9b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
d9c0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
d9d0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72  ./*.** Call expr
d9e0: 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74  Analyze on all t
d9f0: 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20  erms in a WHERE 
da00: 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  clause.  .**.** 
da10: 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
da20: 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 20 61 64  alyze() might ad
da30: 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
da40: 72 6d 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20  rms onto the.** 
da50: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
da60: 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
da70: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c  not want to anal
da80: 79 7a 65 20 74 68 65 73 65 20 6e 65 77 0a 2a 2a  yze these new.**
da90: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
daa0: 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
dab0: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e  ng at the end an
dac0: 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 0a 2a  d work forward.*
dad0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  * so that the ad
dae0: 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
daf0: 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
db00: 65 73 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  essed..*/.void s
db10: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41  qlite3WhereExprA
db20: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
db30: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
db40: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
db50: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
db60: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
db70: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
db80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
db90: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
dba0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
dbb0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
dbc0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
dbd0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
dbe0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
dbf0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c  ../*.** For tabl
dc00: 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f  e-valued-functio
dc10: 6e 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  ns, transform th
dc20: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  e function argum
dc30: 65 6e 74 73 20 69 6e 74 6f 0a 2a 2a 20 6e 65 77  ents into.** new
dc40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
dc50: 72 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 45 61 63  rms.  .**.** Eac
dc60: 68 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  h function argum
dc70: 65 6e 74 20 74 72 61 6e 73 6c 61 74 65 73 20 69  ent translates i
dc80: 6e 74 6f 20 61 6e 20 65 71 75 61 6c 69 74 79 20  nto an equality 
dc90: 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e  constraint again
dca0: 73 74 0a 2a 2a 20 61 20 48 49 44 44 45 4e 20 63  st.** a HIDDEN c
dcb0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
dcc0: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
dcd0: 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
dce0: 72 67 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rgs(.  Parse *pP
dcf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
dd10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
dd20: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
dd30: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
dd40: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
dd50: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 70 72  lause term to pr
dd60: 6f 63 65 73 73 20 2a 2f 0a 20 20 57 68 65 72 65  ocess */.  Where
dd70: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 58 66 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72  Xfer function ar
dda0: 67 75 6d 65 6e 74 73 20 74 6f 20 68 65 72 65 20  guments to here 
ddb0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ddc0: 54 61 62 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  Tab;.  int j, k;
ddd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
dde0: 67 73 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c  gs;.  Expr *pCol
ddf0: 52 65 66 3b 0a 20 20 45 78 70 72 20 2a 70 54 65  Ref;.  Expr *pTe
de00: 72 6d 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  rm;.  if( pItem-
de10: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
de20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61   ) return;.  pTa
de30: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
de40: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
de50: 3d 30 20 29 3b 0a 20 20 70 41 72 67 73 20 3d 20  =0 );.  pArgs = 
de60: 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
de70: 72 67 3b 0a 20 20 69 66 28 20 70 41 72 67 73 3d  rg;.  if( pArgs=
de80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
de90: 6f 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41 72 67  or(j=k=0; j<pArg
dea0: 73 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  s->nExpr; j++){.
deb0: 20 20 20 20 77 68 69 6c 65 28 20 6b 3c 70 54 61      while( k<pTa
dec0: 62 2d 3e 6e 43 6f 6c 20 26 26 20 28 70 54 61 62  b->nCol && (pTab
ded0: 2d 3e 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46 6c 61  ->aCol[k].colFla
dee0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
def0: 44 45 4e 29 3d 3d 30 20 29 7b 6b 2b 2b 3b 7d 0a  DEN)==0 ){k++;}.
df00: 20 20 20 20 69 66 28 20 6b 3e 3d 70 54 61 62 2d      if( k>=pTab-
df10: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
df20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
df30: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
df40: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
df50: 28 29 20 2d 20 6d 61 78 20 25 64 22 2c 0a 20 20  () - max %d",.  
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
df80: 20 6a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   j);.      retur
df90: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  n;.    }.    pCo
dfa0: 6c 52 65 66 20 3d 20 73 71 6c 69 74 65 33 45 78  lRef = sqlite3Ex
dfb0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
dfc0: 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  db, TK_COLUMN, 0
dfd0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
dfe0: 6f 6c 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72  olRef==0 ) retur
dff0: 6e 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e  n;.    pColRef->
e000: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
e010: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f  iCursor;.    pCo
e020: 6c 52 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  lRef->iColumn = 
e030: 6b 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66  k++;.    pColRef
e040: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
e050: 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
e060: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e070: 54 4b 5f 45 51 2c 20 70 43 6f 6c 52 65 66 2c 0a  TK_EQ, pColRef,.
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e0a0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
e0b0: 64 62 2c 20 70 41 72 67 73 2d 3e 61 5b 6a 5d 2e  db, pArgs->a[j].
e0c0: 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20  pExpr, 0));.    
e0d0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e0e0: 74 28 70 57 43 2c 20 70 54 65 72 6d 2c 20 54 45  t(pWC, pTerm, TE
e0f0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  RM_DYNAMIC);.  }
e100: 0a 7d 0a                                         .}.